발판 두 개 사이에 새 Part를 추가해요. 빨간색으로 만들고, Material을 Neon으로 바꾸고, Anchored를 켜고, 이름을 Lava로 해요.
Explorer에서 Lava 위에 마우스를 올리고 + 버튼을 눌러 Script를 골라요.
이미 적혀 있는 줄은 지우고 이 코드를 붙여 넣어요.
Lava > Script
local lava = script.Parent
lava.Touched:Connect(function(hit)
local humanoid = hit.Parent:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.Health = 0
end
end)
각 부분이 하는 일
script.Parent는 스크립트가 들어 있는 part예요. 여기서는 용암이에요.
Touched는 무언가가 part에 닿을 때마다 실행돼요. hit은 닿은 물건이에요. 예를 들면 발이에요.
hit.Parent는 캐릭터 전체예요. Humanoid가 있으면 플레이어라는 뜻이라서, 스크립트가 Health를 0으로 만들어요.
Explorer에서 Workspace 위에 마우스를 올리고 +를 눌러 Folder를 추가해요. 이름은 Checkpoints로 해요.
Anchored를 켠 part 세 개를 코스를 따라 놓고 Folder 안으로 끌어넣어요. 이름은 1, 2, 3으로 해요. 1번은 시작 발판 위에 놓아요.
ServerScriptService 위에 마우스를 올리고 +를 눌러 Script를 추가해요. 이 코드를 붙여 넣어요.
ServerScriptService > Script
local Players = game:GetService("Players")
local checkpoints = workspace:WaitForChild("Checkpoints")
Players.PlayerAdded:Connect(function(player)
local stats = Instance.new("Folder")
stats.Name = "leaderstats"
stats.Parent = player
local stage = Instance.new("IntValue")
stage.Name = "Stage"
stage.Value = 1
stage.Parent = stats
player.CharacterAdded:Connect(function(character)
local root = character:WaitForChild("HumanoidRootPart")
local point = checkpoints:FindFirstChild(tostring(stage.Value))
if point then
task.wait(0.1)
root.CFrame = point.CFrame + Vector3.new(0, 4, 0)
end
end)
end)
for _, point in ipairs(checkpoints:GetChildren()) do
point.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
local stats = player and player:FindFirstChild("leaderstats")
if not stats then return end
local number = tonumber(point.Name)
if number == stats.Stage.Value + 1 then
stats.Stage.Value = number
end
end)
end
각 부분이 하는 일
leaderstats는 특별한 Folder 이름이에요. 이 안의 값은 플레이어 목록에 나타나서, 모두가 각자의 Stage를 볼 수 있어요.
캐릭터가 나타나면, 스크립트가 그 플레이어의 Stage와 이름이 같은 체크포인트로 캐릭터를 옮겨요.
체크포인트를 밟았을 때 다음 번호일 때만 Stage가 올라가요. 그래서 건너뛸 수 없어요.
더 자세히 보기
Folder는 컴퓨터의 폴더처럼 다른 오브젝트를 담아요. 혼자서는 게임에서 아무것도 하지 않아요.
part를 Folder 안으로 끌어넣으려면 Explorer에서 part 이름을 Checkpoints라는 이름 위로 끌어다 놓아요. 그러면 part가 Folder 아래에서 한 칸 오른쪽에 나타나요.
체크포인트 part는 얇고 넓게 만들어요. 예를 들어 Size를 6, 0.4, 6으로 하고 발판 위에 얹어요. 색을 다르게 하면 플레이어가 알아보기 쉬워요.
테스트하려면 F5를 누르고 오른쪽 위의 플레이어 목록을 봐요. Stage 1이라고 나와요. 체크포인트 2를 밟으면 2로 바뀌어요.
체크포인트는 순서대로 밟아야 해요. 2보다 3을 먼저 밟으면 아무 일도 일어나지 않아요.
자주 하는 실수. part 이름을 Checkpoint1이나 One으로 짓는 거예요. 스크립트는 1, 2, 3이라는 정확한 이름을 찾아요.
이 단계가 잘 안 돼요
먼저 이 세 가지를 확인해요
모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.
끝에 큰 Anchored part를 놓고 이름을 Finish로 해요. 플레이어가 목표를 알아볼 수 있게 금색으로 만들어요.
Finish에 Script를 추가하고 이 코드를 붙여 넣어요.
Finish > Script
local Players = game:GetService("Players")
local finish = script.Parent
local cooldown = {}
finish.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
local stats = player and player:FindFirstChild("leaderstats")
if not stats or cooldown[player] then return end
cooldown[player] = true
stats.Stage.Value = 1
player:LoadCharacter()
task.wait(2)
cooldown[player] = nil
end)
각 부분이 하는 일
GetPlayerFromCharacter는 결승선에 닿은 플레이어가 누구인지 찾아 줘요.
cooldown table은 같은 1초 안에 코드가 여러 번 실행되는 걸 막아 줘요.
Stage는 1로 돌아가고, LoadCharacter가 플레이어를 시작 지점으로 보내서 다시 도전할 수 있어요.
더 자세히 보기
금색으로 만들려면 Properties에서 Color 칸을 클릭하고 노란색을 골라요. Material을 Neon으로 하면 반짝여요.
Size 12, 1, 12가 결승선으로 좋아요. 마지막 점프 뒤에, 다른 발판보다 조금 높게 놓아요.
테스트하려면 F5를 누르고, 코스를 끝까지 가서 금색 part를 밟아요. 시작 지점으로 돌아오고 Stage가 다시 1로 바뀌어요.
2초 쿨다운이 있는 이유는 한 걸음에 part가 여러 번 닿기 때문이에요.
이 단계가 잘 안 돼요
먼저 이 세 가지를 확인해요
모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.