기본 스크립팅 자습서를 통해 플레이 가능한 장면을 만들기 위해 개별 부품을 스크립팅했습니다.이전 방법으로, 부품을 복제하면 스크립트도 복제됩니다.이렇게 하면 스크립트를 업데이트하는 것이 번거로워지므로 변경 사항을 스크립트별로 수행해야 합니다.
이 자습서에서는 단일 스크립트의 복사본만 사용하여 건강 픽업 행동을 결정하는 여러 건의 건강 픽업을 만드는 다른 패턴이 사용됩니다.픽업이 터치되면 플레이어의 체력이 회복되고, 약간 사라지고 짧은 시간 동안 비활성화됩니다.
설정
우선, 픽업으로 사용할 부품이나 모델이 필요합니다.전투 마을 예시 세계 는 맵 전체에 분산된 많은 체력 획득을 포함합니다.

각 체력 획득은 내부에 녹색 포인트라이트가 있는 두 직사각형 부품의 연합입니다.모두 작업 공간의 HealthPickups 라는 폴더에 저장되며, 스크립트가 검색할 곳입니다.맵에 더 추가하면 이 폴더에도 저장되는지 확인해야 합니다.


체력 회복
우선, 스크립트는 플레이어의 체력을 복원해야 합니다. 이 패턴은 치명적인 용암 튜토리얼에서 익숙해야 합니다.
에서 ServerScriptService , PickupManager 라는 스크립트를 추가합니다.
이 스크립트에서는 값 MAX_HEALTH의 상수를 선언하여 **** 를 선언합니다.
픽업과 픽업 자체에 접촉한 다른 부분의 매개변수가 있는 함수 onTouchHealthPickup.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end함수에서 otherPart의 부모에서 캐릭터 모델을 가져옵니다. 다음으로, Humanoid를 사용하여 FindFirstChildWhichIsA()에 있는지 확인합니다.
인간형이 있는 경우, 그들의 체력 속성을 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 함수를 사용하여 작업 공간에서 건강 픽업 폴더를 가져옵니다.
변수 healthPickups 생성하여 결과를 저장하고 GetChildren 함수를 호출하는 것에 대한 결과를 저장합니다.Create a variable named to store the result of calling the function on healthPickupsFolder
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를 사용하는 루프 A는 다음과 같이 정의됩니다:
- 인덱스 : 이는 일반 for 루프의 제어 변수와 동일합니다.
- 값 : 루프가 반복될 때 배열의 각 요소로 채워집니다.실제로 포함될 내용 후에 값 변수 이름을 지정하는 것이 좋습니다.
- 배열 : 반복하려는 배열이 ipairs 함수에 전달됩니다.
다음 코드에서는 아무것도 인덱스가 필요하지 않으므로 _ 로 비워둘 수 있습니다.Create a for 루프를 사용하여 ipairs 함수를 통해 healthPickups 을 전달합니다.
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
래퍼 함수가 필요하여 연결하는 경우 상태 획득을 함수에 전달해야 합니다.
for 루프에서 터치된 이벤트를 otherPart라는 매개변수가 있는 익명 함수에 연결하십시오.
onTouchHealthPickups 함수를 호출하여 둘 다 otherPart 매개 변수와 healthPickup 을 전달합니다.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
코드를 지금 테스트하고 건강 획득이 건강을 회복한다는 것을 알아야 합니다.먼저 플레이어에게 피해를 입혀야 합니다 - 스폰 지점 옆에 있는 환풍구에 서 보세요.
플레이어가 치유되면 오른쪽 상단에 건강 바가 나타나야 합니다.
픽업 대기시간
현재 픽업은 무기한 그것을 만지는 모든 플레이어를 치유할 것입니다.다시 사용할 수 있을 때까지 짧은 대기 시간이 있는 한 게임에서 한 번만 선택할 수 있으면 더 효과적일 것입니다.
먼저, 픽업이 쿨타임 기간에 있는지 여부를 기록해야 합니다.아래 패턴은 페이드 트랩에서 익숙해야 합니다. 이번에는 건강 획득에 특성을 설정하여 디바운스가 달성됩니다.
for 루프에서 새 특성 을 에 호출하는 새로운 특성을 설정합니다.
코드를 조건 healthPickup:GetAttribute("Enabled") 을 사용하여 if 문으로 감싼 다음 onTouchHealthPickup 에 배치합니다.
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