[Roblox] Passos Dinâmicos

Fala galera!

Criei um script que muda o som dos passos do jogador para cada tipo de material que ele pisa.




Primeiro nós criamos um dicionário com cada material e seu som correspondente:

local Sounds = {
	[Enum.Material.Concrete] = "rbxassetid://2991635108",
	[Enum.Material.Wood] = "rbxassetid://2015989574",
	[Enum.Material.WoodPlanks] = "rbxassetid://2015989574",
	[Enum.Material.Metal] = "rbxassetid://1083174031",
	[Enum.Material.CorrodedMetal] = "rbxassetid://1083174031",
	[Enum.Material.DiamondPlate] = "rbxassetid://1083174031",
	[Enum.Material.Plastic] = "rbxassetid://4518544234",
	[Enum.Material.SmoothPlastic] = "rbxassetid://4518544234",
	[Enum.Material.Sand] = "rbxassetid://833564767",
	[Enum.Material.Grass] = "rbxassetid://252965149"
}

Você pode adicionar quantos materiais quiser.

Em seguida, nós criamos uma variável com o LocalPlayer e vinculamos uma função no evento CharacterAdded:

local Player = game:GetService("Players").LocalPlayer
local Sounds = {
	[Enum.Material.Concrete] = "rbxassetid://2991635108",
	[Enum.Material.Wood] = "rbxassetid://2015989574",
	[Enum.Material.WoodPlanks] = "rbxassetid://2015989574",
	[Enum.Material.Metal] = "rbxassetid://1083174031",
	[Enum.Material.CorrodedMetal] = "rbxassetid://1083174031",
	[Enum.Material.DiamondPlate] = "rbxassetid://1083174031",
	[Enum.Material.Plastic] = "rbxassetid://4518544234",
	[Enum.Material.SmoothPlastic] = "rbxassetid://4518544234",
	[Enum.Material.Sand] = "rbxassetid://833564767",
	[Enum.Material.Grass] = "rbxassetid://252965149"
}

Player.CharacterAdded:Connect(function(Character)
	local Head = Character:WaitForChild("Head")
	local Root = Character:WaitForChild("HumanoidRootPart")
	local Humanoid = Character:WaitForChild("Humanoid")
end)

Agora nós precisamos de uma função que seja executada assim que a propriedade FloorMaterial do humanoid seja alterada. Para fazer isso, vamos utilizar o evento Changed:

Player.CharacterAdded:Connect(function(Character)
	local Head = Character:WaitForChild("Head")
	local Root = Character:WaitForChild("HumanoidRootPart")
	local Humanoid = Character:WaitForChild("Humanoid")

	Humanoid.Changed:Connect(function(Property)
		--[[ Lembrando que o nome da nossa propriedade é 'FloorMaterial'
		e só queremos executar a função quando ela mudar.
		]]

		--[[ O objeto que armazena o som do passo do jogador pode estar na Head
		ou no HumanoidRootPart (Caso o character seja R15)
		]]

		local Sound = Head:FindFirstChild("Running") or Root:FindFirstChild("Running")
		if Property == "FloorMaterial" then
			-- Caso o material não esteja registrado no dicionário, será usado o do concreto por padrão
			Sound.SoundId = Sounds[Humanoid.FloorMaterial] or Sounds[Enum.Material.Concrete]
		end
	end)
end)

E é assim como funciona este script, até mais =P
(Em caso de dúvidas, digam aqui no tópico que eu respondo à vocês)

Código Completo

Como usar: Crie um LocalScript dentro da ReplicatedFirst e cole o código acima.

-- Variáveis
local Player = game:GetService("Players").LocalPlayer
local Sounds = {
	[Enum.Material.Concrete] = "rbxassetid://2991635108",
	[Enum.Material.Wood] = "rbxassetid://2015989574",
	[Enum.Material.WoodPlanks] = "rbxassetid://2015989574",
	[Enum.Material.Metal] = "rbxassetid://1083174031",
	[Enum.Material.CorrodedMetal] = "rbxassetid://1083174031",
	[Enum.Material.DiamondPlate] = "rbxassetid://1083174031",
	[Enum.Material.Plastic] = "rbxassetid://4518544234",
	[Enum.Material.SmoothPlastic] = "rbxassetid://4518544234",
	[Enum.Material.Sand] = "rbxassetid://833564767",
	[Enum.Material.Grass] = "rbxassetid://252965149"
}

-- Funções
function OnCharacterAdded(Character)
	local Head = Character:WaitForChild("Head")
	local Root = Character:WaitForChild("HumanoidRootPart")
	local Humanoid = Character:WaitForChild("Humanoid")
	
	Humanoid.Changed:Connect(function(Property)
		local Sound = Head:FindFirstChild("Running") or Root:FindFirstChild("Running")
		
		if Property == "FloorMaterial" then
			Sound.SoundId = Sounds[Humanoid.FloorMaterial] or Sounds[Enum.Material.Concrete]
		end
	end)
end

-- Eventos
Player.CharacterAdded:Connect(OnCharacterAdded)
5 Curtidas

Legal! Recomendo que use variáveis locais, e não globais, por serem lidas em um tempo menor.

1 Curtida