기본 스크립팅 튜토리얼을 통해, 여러분은 플레이 가능한 장면을 만들기 위해 개별 부품을 스크립팅했습니다. 이전 방법으로 부품을 복제하면 스크립트도 복제되므로, 스크립트를 업데이트하는 것이 번거로워질 수 있습니다. 각 스크립트를 개별적으로 수정해야 하기 때문입니다.
이 튜토리얼에서는 건강 픽업을 여러 개 만들기 위해 다른 패턴을 사용할 것입니다. 이 패턴에서는 건강 픽업 동작을 결정하는 스크립트의 단일 복사본만 사용합니다. 픽업이 터치되면 플레이어의 건강을 회복하고, 약간 사라지며, 짧은 시간 동안 비활성화됩니다.
설정하기
먼저, 픽업으로 사용할 부품이나 모델이 필요합니다. Showdown Town 예제 월드에는 맵 곳곳에 많은 건강 픽업이 포함되어 있습니다.

각 건강 픽업은 두 개의 직사각형 부품의 유니온으로, 내부에 녹색 포인트 라이트가 있습니다. 이들은 모두 HealthPickups라는 이름의 폴더에 저장되어 있으며, 스크립트는 이 폴더에서 픽업을 찾습니다. 맵에 더 추가할 경우, 반드시 이 폴더에 저장되도록 해야 합니다.


건강 회복하기
우선, 스크립트가 플레이어의 건강을 회복해야 합니다. 이 패턴은 Deadly Lava 튜토리얼에서 익숙할 것입니다.
ServerScriptService에 PickupManager라는 이름의 스크립트를 추가합니다.
이 스크립트에서 MAX_HEALTH라는 상수를 100으로 선언합니다.
픽업과 터치된 다른 부품에 대한 매개변수를 가진 onTouchHealthPickup이라는 함수를 만듭니다.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end함수 내에서 otherPart의 부모로부터 캐릭터 모델을 가져옵니다. 다음으로, FindFirstChildWhichIsA()를 사용하여 Humanoid가 있는지 확인합니다.
휴머노이드가 있다면, 그들의 Health 속성을 MAX_HEALTH로 설정합니다.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
픽업 폴더 가져오기
건강 픽업을 보관하는 폴더는 스크립트가 실행될 때 게임에 로드되지 않았을 수 있습니다. WaitForChild를 사용하여 스크립트를 일시 중지하고 HealthPickups 폴더가 로드될 때까지 기다릴 수 있습니다.
폴더에서 호출할 때, GetChildren 함수는 폴더의 내용을 배열로 반환합니다.
MAX_HEALTH 아래에 healthPickupsFolder라는 변수를 선언하고, WaitForChild 함수를 사용하여 Workspace에서 HealthPickups 폴더를 가져옵니다.
healthPickupsFolder에서 GetChildren 함수를 호출한 결과를 저장할 healthPickups라는 변수를 만듭니다.
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
ipairs로 루프하기
onTouchHealthPickup는 배열의 각 건강 픽업에 대해 호출되어야 합니다. 이를 효율적으로 수행하기 위해 새로운 종류의 루프 구문을 사용할 것입니다.
ipairs는 for 루프와 함께 사용하여 배열의 각 요소를 순회할 수 있는 함수입니다. 루프가 시작하고 끝나는 위치를 지정할 필요가 없습니다. ipairs를 사용하는 for 루프는 다음과 같이 정의됩니다:

- Index: 이는 일반 for 루프의 제어 변수와 같습니다.
- Value: 루프가 반복될 때 배열의 각 요소로 채워집니다. 이 값을 실제로 포함할 내용에 따라 이름을 지정하는 것이 좋습니다.
- Array: 반복할 배열이 ipairs 함수에 전달됩니다.
다음 코드에서는 인덱스가 필요하지 않으므로 _로 비워둘 수 있습니다. ipairs 함수를 사용하여 healthPickups를 전달하는 for 루프를 만듭니다.
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
end픽업을 onTouchHealthPickup 함수에 전달하기 위해 래퍼 함수가 필요합니다.
for 루프 내에서 Touched 이벤트를 otherPart라는 매개변수를 가진 익명 함수에 연결합니다.
onTouchHealthPickup 함수를 호출하고, otherPart 매개변수와 healthPickup을 전달합니다.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
이제 코드를 테스트하면 건강 픽업이 건강을 회복하는 것을 확인할 수 있습니다. 먼저 플레이어에게 피해를 주어야 합니다 - 스폰 지점 옆의 환풍기 위에 서 보세요.

오른쪽 상단에 건강 바가 나타나고, 플레이어가 회복되면 사라져야 합니다.
픽업 쿨다운
현재 픽업은 터치하는 모든 플레이어의 건강을 무한히 회복합니다. 픽업이 한 번만 사용 가능하고, 다시 사용할 수 있기 전에 짧은 쿨다운이 있는 것이 더 효과적일 것입니다.
먼저, 픽업이 쿨다운 기간에 있는지 여부를 기록해야 합니다. 아래 패턴은 Fade Trap에서 익숙할 것입니다. 이번에는 건강 픽업에 속성을 설정하여 디바운스를 달성할 것입니다.
for 루프 내에서 "Enabled"라는 새로운 속성을 true로 설정합니다.
onTouchHealthPickup 내의 코드를 healthPickup:GetAttribute("Enabled") 조건을 가진 if 문으로 감쌉니다.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
픽업 비활성화
픽업은 비활성화되었다는 시각적 피드백을 제공해야 합니다. 이를 나타내는 일반적인 방법은 약간 투명하게 만드는 것입니다.
스크립트 상단에 세 개의 상수를 선언합니다(각 값을 원하는 대로 조정해도 좋습니다):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")onTouchHealthPickup의 if 문에서 픽업의 Transparency를 DISABLED_TRANSPARENCY로 설정하고, Enabled 속성의 값을 false로 설정합니다.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendtask.wait() 함수를 호출하고, COOLDOWN을 대기 시간으로 전달합니다.
Transparency를 다시 ENABLED_TRANSPARENCY로 설정하고, Enabled를 true로 되돌립니다.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
픽업을 다시 테스트해 보세요: 픽업을 터치하면 건강이 회복되고, 투명해졌다가 다시 사용 가능해져야 합니다.
픽업이 수집될 때 플레이어에게 더 강력한 피드백을 주고 싶다면, 투명도를 변경할 때 픽업의 포인트 라이트 밝기를 줄여보세요.
이 건강 픽업을 여러분의 프로젝트에서 사용해 보거나, 외관과 효과를 변경하여 플레이어에게 다른 종류의 파워업을 제공해 보세요.
최종 코드
local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end