기본 스크립트 튜토리얼을 통해 플레이 가능한 장면을 만들기 위해 개별 부품을 스크립트로 구성합니다. 이전 방법으로 부품을 복제하면 스크립트가 중복되므로 스크립트를 업데이트하는 것이 지루해질 수 있습니다. 이렇게 하면 스크립트를 스크립트별로 업데이트해야 하기 때문에 스크립트를 업데이트하는 것이
이 튜토리얼에서는 스크립트 하나로 여러 건강 피드업을 만드는 방법에 대해 설명합니다. 피드업을 만드는 유일한 복사본은 스크립트 하나로 결정되며, 피드업이 만들어지면 플레이어의 체력이 회복되고, 잠깐 시간 동안 사라지고 다시 작동하지 않습니다.
설정
먼
각 체력 피크업은 두 개의 직사각형 부품으로 구성된 그린 포인트라이트가 있는 유니온입니다. 모두 체력 피크업 폴더에 저장됩니다. 스크립트가 이 폴더에서 찾을 수 있도록 추가하면 필요합니다. 만약 맵에 더 추가하면, 필수적으로 이 폴더에도 저장되어
체력 회복
시작하려면 스크립트는 플레이어의 체력을 회복해야 합니다. 이 패턴은 치명적인 용암 튜토리얼에서 익숙해야 합니다.
In ServerScriptService , PickupManager 라는 이름의 스크립트를 추가합니다.
이 스크립트에서 MAX_HEALTH 라는 상수를 선언하고 값 100 을 사용합니다.
피크업 및 피크업 자체에 대한 매개 변수가 있는 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 를 사용하여 스크립트를 일시 중지하고 픽업 폴더를 로드할 수 있습니다.
폴더를 호출할 때 GetChildren 함수는 폴더의 콘텐츠 배열을 반환합니다.
MAX_HEALTH 아래에서 변수를 선언하고 healthPickupsFolder라는 이름의 변수를 사용하고 WaitForChild 함수를 사용하여 작업 공간에서 HealthPickups 폴더를 가져옵니다.
healthPickups이라는 변수를 생성하여 GetChildren 함수를 호출하는 경우의 결과를 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 는 다음과 같이 정의됩니다.
- 인덱스 : 이것은 정규 루프에 있는 컨트롤 변수와 동일합니다.
- 값 : 루프가 반복되면서 배열의 각 요소에 채워질 것입니다. 실제 내용을 기반으로 값 변수를 이름 지정하는 것이 좋습니다.
- 배열: : 반복할 배열이 아이팩터 함수에 전달됩니다.
다음 코드에서는 인덱스가 필요하지 않으므로 _ 와 함께 빈 공백으로 남겨 줄 수 있습니다. for 루프를 만들려면 ipairs 함수를 사용하여 건너뛰고 1> healthPickups1> 를 사용하여 반환합니다.
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
Touched 이벤트에 연결할 때 체크 픽업을 건너뛰려면 래퍼 함수가 필요합니다.
In the for 루프, otherPart 매개 변수를 가진 익명 함수에 Touched 이벤트를 연결합니다.
onTouchHealthPickups 함수를 호출하여 모든 otherPart 매개 변수와 healthPickup 을 통과합니다.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
지금 코드를 테스트하면 체력 획득이 체력을 회복하는 것을 알 수 있습니다. 먼저 플레이어에게 피해를 입혀야 합니다. 생성 지점 옆에 있는 벤트에 서서 플레이어를 얻으십시오.
플레이어가 치유되면 상단 오른쪽에 건강 바가 나타나고 사라집니다.
픽업 대기시간
현재 피커업은 플레이어가 그것을 만질 때마다 영구적으로 치유됩니다. 이 게임에서는 피커업을 한 번만 선택할 수 있고, 짧은 대기 시간이 지난 후에만 다시 사용할 수 있습니다.
먼저, 픽업이 쿨다운 기간에 있는지 여부를 기록해야 합니다. 패턴은 망가지는 함정 - 이번에는 건강 픽업에 속성을 설정하여 디바운스를 달성합니다.
In the for loop, set a new 특성 called "Enabled" to true .
onTouchHealthPickup 안에 코드를 묶는 이 문을 이 조건을 가진 if 문으로 감싼다: healthPickup:GetAttribute("Enabled") .
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")In the if statement in onTouchHealthPickup , set the Transparency of the pickup to DISABLED_TRANSPARENCY , and the value of the 1> Enabled1> attribute to 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)endendend콜백에서 task.wait() 함수를 호출하여 대기 시간 COOLDOWN을 전달합니다.
Transparency를 다시 설정하고 ENABLED_TRANSPARENCY 및 Enabled를 다시 설정하고 1>true1>로 돌아갑니다.
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