Sistema de moedas coletáveis

Esse sistema usa um único código que observa todas as moedas ou coletáveis do jogo. Para isso, temos que colocar todas as moedas dentro de uma única pasta. Vamos renomear a pasta para Moedas, já que é assim que a chamamos no código.

Pasted image 20240426104732.png

Após isso vamos para o a pasta ServerScriptServices. Nela vamos criar um script e colocar o seguinte código:

local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")

local pastaMoedas= Workspace.Moedas
local moedas = pastaMoedas:GetChildren()

for _, moeda in moedas do
	moeda.Touched:Connect(function(outraParte)
		local character = outraParte.Parent
		local player = Players:GetPlayerFromCharacter(character)
		if player then
			--Aqui dentro conseguimos colocar o que vai acontecer ao tocar a moeda
			moeda.Transparency = 1
		end
	end)
end

Indo um passo a frente

Se quisermos fazer um sistema de pontuação, o código se torna mais complexo. Vamos primeiro criar mais um script dentro de ServerScriptServices (nesse momento eu recomendo renomear ambos para não confundir o que cada um deles faz). Abaixo tem a versão atualizada do script que faz a moeda funcionar e, em seguida, o da pontuação.

local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")

local pastaMoedas= Workspace.Moedas
local moedas = pastaMoedas:GetChildren()

for _, moeda in moedas do
	moeda:SetAttribute("Enabled", true)
	moeda.Touched:Connect(function(outraParte)
		if moeda:GetAttribute("Enabled") then			
			local character = outraParte.Parent
			local player = Players:GetPlayerFromCharacter(character)
			if player then
				local pontos = player.leaderstats.Pontos
				moeda.Transparency = 1
				pontos.Value +=1
				moeda:SetAttribute("Enabled", false	)
			end
		end
	end)
end
local Players = game:GetService("Players")

local function onCharacterAdded(character, player)
	player:SetAttribute("IsAlive", true)
	local humanoid = character:WaitForChild("Humanoid")
-- Se não quiser que a pontuação do jogador zere quando ele morra, delete esse pequeno bloco de texto abaixo.
	humanoid.Died:Connect(function()
		local points = player.leaderstats.Points
		points.Value = 0
		player:SetAttribute("IsAlive", false)
	end)
end

local function onPlayerAdded(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local points = Instance.new("IntValue")
	points.Name = "Pontos"
	points.Value = 0
	points.Parent = leaderstats

	player:SetAttribute("IsAlive", false)

	player.CharacterAdded:Connect(function(character)
		onCharacterAdded(character, player)
	end)
end

Players.PlayerAdded:Connect(onPlayerAdded)

Sua pasta ServerScriptServices deve ficar assim:

Pasted image 20240426105447.png