Scaling a model via script

Hey all, I’m looking to scale models down to about 1/10th their size programmatically.

I ran across this function and not much else on the forums. Unfortunately, it doesn’t actually appear to work.

(Left is the original model. Right is the model passed through the function with a scale of 1)

Given that you can resize manually in Studio itself, I figure somebody must have some code out there available. It just doesn’t seem that I can find it.

Any help would be appreciated!

1 Like

Show the original in Explorer and the code.

My code modifed
local main = {}

-- коэффициент изменения размера
--[[
----------- Главный модуль логики ----------- 

main:ResizeChar(char,Scale)		-- скалирование персонажа
main:ResizeModel(Model, Scale)	-- скалирование модели
]]
-- scaling factor
-- cell size
SCALE = game.Workspace.Constant.SizeVillage.Value	-- коэффициент скалирования
SizeGrid = game.Workspace.Constant.SizeGrid.Value 
	
-- изменение размера персонажа R15
function main:ResizeChar(char,Scale)
	if SCALE == 1 then return end	-- не используем изменение размера

	char.Humanoid.BodyDepthScale.Value = Scale
	char.Humanoid.BodyHeightScale.Value = Scale
	char.Humanoid.BodyWidthScale.Value = Scale
	char.Humanoid.HeadScale.Value = Scale
end

-- скалирование размера модели домика
-- https://devforum.roblox.com/t/scaling-models-with-rotation-orientation/288777/4
function main:ResizeModel(Model, Scale) -- loops through model and scales
	if SCALE == 1 then return end	-- не используем изменение размера

	local Primary = Model.PrimaryPart
	local PrimaryCFrame = Primary.CFrame

	for i, Part in pairs(Model:GetDescendants()) do --GetChildren
		if Part:IsA("BasePart") then
			Part.Size = (Part.Size * Scale) -- изменение размера
			if Part ~= Primary then
				-- Если это не PrimaryPart то меняем его позицию
				Part.Position = PrimaryCFrame.Position + (Part.Position-PrimaryCFrame.Position)* Scale
			end
		end
		if Part:IsA("Texture") then
			Part.StudsPerTileU = SizeGrid * Scale 
			Part.StudsPerTileV = SizeGrid * Scale
		end
	end
end

return main

Code for part - click detector
local ReplicatedStorage = game:GetService("ReplicatedStorage") -- берём ссылку на сервис хранения
local Global = require(ReplicatedStorage.GlobalModule)	-- подключение модуля

local clickDetector = script.Parent.ClickDetector	-- подключения детектора клика

-- коэффициент изменения размера
SCALE = game.Workspace.Constant.SizeVillage.Value

-- функция обработки клика
function onMouseClick(player)
	--	print("You clicked me!",player.Name)
	
	if SCALE == 1 then return end
	
	local character = player.Character or player.CharacterAdded:wait()	-- поиск кликнувшего персонажа
	
	if  character.Humanoid.HeadScale.Value >0.9 then
		Global:ResizeChar(character,SCALE)
		-- меняем характеристики
		character.Humanoid.WalkSpeed=character.Humanoid.WalkSpeed * SCALE
		character.Humanoid.JumpPower=character.Humanoid.JumpPower * SCALE
		
		-- смена текстуры
		local Part = script.Parent.Parent.Texture
		Part.Texture = ReplicatedStorage.Textures.Grid.Texture
		-- Part.StudsPerTileU = Part.StudsPerTileU * SCALE 
		-- Part.StudsPerTileV = Part.StudsPerTileV * SCALE

	else
		character.Humanoid.Jump=true	-- чтобы вылезти из земли
		Global:ResizeChar(character,1)
		-- меняем характеристики
		character.Humanoid.WalkSpeed=character.Humanoid.WalkSpeed / SCALE
		character.Humanoid.JumpPower=character.Humanoid.JumpPower / SCALE
		character.Humanoid.Jump=true	-- чтобы вылезти из земли
		
		-- смена текстуры
		local Part = script.Parent.Parent.Texture
		Part.Texture = "rbxassetid://17981533"
		-- Part.StudsPerTileU = Part.StudsPerTileU * SCALE 
		-- Part.StudsPerTileV = Part.StudsPerTileV * SCALE
	end
	
end

clickDetector.MouseClick:connect(onMouseClick)
1 Like