현재 플레이어는 어떤 플랫폼에서도 떨어져도 아무런 결과가 없습니다. 이 섹션에서는 게임의 물과 같은 높이에 큰 보이지 않는 위험 요소를 만드는 방법을 안내합니다. 플레이어가 위험 요소에 떨어지면 체력이 0으로 줄어들고 게임 시작 지점에서 다시 태어납니다.
기본 물 위험 요소 만들기
기본 물 위험 요소 만들기
Workspace > World에서 Hazards라는 새 폴더를 만듭니다.
Hazards 폴더 안에 Hazard라는 이름의 블록 Part를 만들고 크기를 825, 1, 576으로 설정하고 CFrame.Position을 174, -6.5, 38로 설정하여 이 부분이 섬과 플랫폼 주변의 물을 덮도록 합니다.
투명도를 1로 설정하여 이 부분이 보이지 않게 하고 실제 물이 위험 요소처럼 보이도록 하며, CanCollide를 비활성화하여 플레이어가 이 부분을 통과하여 물로 떨어지게 하고, Anchored를 활성화하여 물리학이 이 부분을 움직이지 않도록 합니다.플레이어가 위험 요소에 닿을 때 감지하기
위험 요소는 Touched를 듣고 플레이어의 체력을 0으로 낮추는 스크립트를 작성할 때까지 아무런 작용을 하지 않습니다.
HazardService 만들기
ServerScriptService에서 HazardService라는 이름의 스크립트를 만들고 다음 코드를 입력합니다:
```lua
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local hazardsFolder = Workspace.World.Hazards
local hazards = hazardsFolder:GetChildren()
local function onHazardTouched(otherPart)
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
end
for _, hazard in hazards do
hazard.Touched:Connect(onHazardTouched)
end
```코드 설명
HazardService는 CoinService와 많은 유사점을 가지고 있습니다. 그러나 플레이어가 위험 요소에 닿을 때 체력이 0으로 설정됩니다.
게임에서 위험 요소 객체를 수정, 추가 또는 제거하여 독특한 장애물을 만들 수 있습니다. Hazards 폴더에 포함되어 있는 한, 코드 루프는 모든 위험 요소에 이벤트 핸들러를 연결합니다.
플레이어 생명 주기에 연결하기
플레이어 생명 주기는 플레이어가 게임에서 상호작용할 때 발생하는 이벤트를 나타냅니다. 예를 들어, 게임에 참여하거나, 떠나거나, 다시 태어나는 경우입니다. 이러한 이벤트에 핸들러를 연결하여 각 주요 생명 주기 이벤트에 대한 논리를 실행해야 합니다.
CoinService에 생명 주기 핸들러 추가
ServerScriptService에서 기존 CoinService 스크립트의 맨 아래에 다음 코드를 추가합니다 (기존 코드를 교체하지 마세요 — 그 뒤에 추가합니다):
```lua
local function onPlayerAdded(player)
-- 플레이어의 코인을 0으로 초기화
updatePlayerCoins(player, function(_)
return 0
end)
player.CharacterAdded:Connect(function(character)
-- WaitForChild는 플레이어 루프를 중단하므로 아래는 별도의 스레드에서 수행해야 합니다
task.spawn(function()
-- 플레이어가 죽을 때
character:WaitForChild("Humanoid").Died:Connect(function()
-- 플레이어의 코인을 0으로 초기화
updatePlayerCoins(player, function(_)
return 0
end)
end)
end)
end)
end
-- PlayerAdded 이벤트에 연결하기 전에 추가된 플레이어 초기화
for _, player in Players:GetPlayers() do
onPlayerAdded(player)
end
local function onPlayerRemoved(player)
updatePlayerCoins(player, function(_)
return nil
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoved)
```코드 설명
이 코드는 적절한 생명 주기 이벤트 동안 코인 수를 초기화하는 함수를 정의합니다:
- Players.PlayerAdded는 플레이어가 게임에 참여할 때 발생하며, 코인 수를 0으로 설정합니다.
- Player.CharacterAdded는 플레이어의 캐릭터 모델이 세계에 추가될 때 발생합니다. 이는 PlayerAdded 이후와 플레이어가 다시 태어날 때마다 발생합니다.
- Humanoid.Died는 플레이어가 죽을 때 발생하며, 코인 수를 0으로 설정합니다. task.spawn()은 이를 처리하기 위해 별도의 스레드를 생성하므로 플레이어 생명 주기의 다른 측면이 실행될 수 있습니다.
- Player.PlayerRemoved는 플레이어가 게임을 떠날 때 발생하여 플레이어 상태를 정리합니다.
- 이 코드에는 플레이어가 Players.PlayerAdded 이벤트가 실행되기 전에 코인을 수집할 수 있는 잠재적인 문제가 있습니다. 이를 완화하기 위해 코드 스케줄링이나 초기화가 완료될 때까지 플레이어의 캐릭터를 동결하는 등의 솔루션을 고려할 수 있습니다. 그러나 이러한 솔루션은 이 튜토리얼의 범위를 넘어서는 더 복잡한 스크립팅 개념을 포함합니다.
플레이 테스트
드롭다운에서 Test를 선택하고 Play를 클릭합니다. 몇 개의 코인을 수집한 후 물에 뛰어듭니다. 캐릭터가 죽고 시작 지점에서 다시 태어나며 코인 수가 0으로 초기화되어야 합니다.