건강 획득 생성

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

기본 스크립트 튜토리얼을 통해 플레이 가능한 장면을 만들기 위해 개별 부품을 스크립트로 구성합니다. 이전 방법으로 부품을 복제하면 스크립트가 중복되므로 스크립트를 업데이트하는 것이 지루해질 수 있습니다. 이렇게 하면 스크립트를 스크립트별로 업데이트해야 하기 때문에 스크립트를 업데이트하는 것이

이 튜토리얼에서는 스크립트 하나로 여러 건강 피드업을 만드는 방법에 대해 설명합니다. 피드업을 만드는 유일한 복사본은 스크립트 하나로 결정되며, 피드업이 만들어지면 플레이어의 체력이 회복되고, 잠깐 시간 동안 사라지고 다시 작동하지 않습니다.

설정

Edit in Studio option from the experience's main page

각 체력 피크업은 두 개의 직사각형 부품으로 구성된 그린 포인트라이트가 있는 유니온입니다. 모두 체력 피크업 폴더에 저장됩니다. 스크립트가 이 폴더에서 찾을 수 있도록 추가하면 필요합니다. 만약 맵에 더 추가하면, 필수적으로 이 폴더에도 저장되어

체력 회복

시작하려면 스크립트는 플레이어의 체력을 회복해야 합니다. 이 패턴은 치명적인 용암 튜토리얼에서 익숙해야 합니다.

  1. In ServerScriptService , PickupManager 라는 이름의 스크립트를 추가합니다.

  2. 이 스크립트에서 MAX_HEALTH 라는 상수를 선언하고 값 100 을 사용합니다.

  3. 피크업 및 피크업 자체에 대한 매개 변수가 있는 onTouchHealthPickup 함수를 생성합니다.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. 함수에서 otherPart 의 부모에서 캐릭터 모델을 가져옵니다. 다음으로 확인하여 Humanoid 를 사용하여 FindFirstChildWhichIsA() 를 사용하는지 여부를 확인하십시오.

  5. 만약 그것이 인간형이라면, 그들의 체력 속성을 MAX_HEALTH로 설정합니다.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

픽업 폴더 생성

스크립트가 실행될 때까지 폴더에 있는 건강 픽업이 게임에로드되지 않을 수 있습니다. WaitForChild 를 사용하여 스크립트를 일시 중지하고 픽업 폴더를 로드할 수 있습니다.

폴더를 호출할 때 GetChildren 함수는 폴더의 콘텐츠 배열을 반환합니다.

  1. MAX_HEALTH 아래에서 변수를 선언하고 healthPickupsFolder라는 이름의 변수를 사용하고 WaitForChild 함수를 사용하여 작업 공간에서 HealthPickups 폴더를 가져옵니다.

  2. healthPickups이라는 변수를 생성하여 GetChildren 함수를 호출하는 경우의 결과를 healthPickupsFolder에 저장합니다.


    local MAX_HEALTH = 100
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
    local healthPickups = healthPickupsFolder:GetChildren()
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

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 이벤트에 연결할 때 체크 픽업을 건너뛰려면 래퍼 함수가 필요합니다.

  1. In the for 루프, otherPart 매개 변수를 가진 익명 함수에 Touched 이벤트를 연결합니다.

  2. onTouchHealthPickups 함수를 호출하여 모든 otherPart 매개 변수와 healthPickup 을 통과합니다.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

지금 코드를 테스트하면 체력 획득이 체력을 회복하는 것을 알 수 있습니다. 먼저 플레이어에게 피해를 입혀야 합니다. 생성 지점 옆에 있는 벤트에 서서 플레이어를 얻으십시오.

플레이어가 치유되면 상단 오른쪽에 건강 바가 나타나고 사라집니다.

픽업 대기시간

현재 피커업은 플레이어가 그것을 만질 때마다 영구적으로 치유됩니다. 이 게임에서는 피커업을 한 번만 선택할 수 있고, 짧은 대기 시간이 지난 후에만 다시 사용할 수 있습니다.

먼저, 픽업이 쿨다운 기간에 있는지 여부를 기록해야 합니다. 패턴은 망가지는 함정 - 이번에는 건강 픽업에 속성을 설정하여 디바운스를 달성합니다.

  1. In the for loop, set a new 특성 called "Enabled" to true .

  2. onTouchHealthPickup 안에 코드를 묶는 이 문을 이 조건을 가진 if 문으로 감싼다: healthPickup:GetAttribute("Enabled") .


    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
    end
    end
    end
    for _, healthPickup in ipairs(healthPickups) do
    healthPickup:SetAttribute("Enabled", true)
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

픽업 비활성화

픽업은 비활성화된 시각적 피드백을 제공해야 합니다. 이를 나타내는 일반적인 방법은 약간 투명하게 만드는 것입니다.

  1. 스크립트 상단에 세 가지 상수를 선언하십시오(각 값을 원하는 대로 조정하세요):

    • ENABLED_TRANSPARENCY = 0.4
    • DISABLED_TRANSPARENCY = 0.9
    • COOLDOWN = 10

    local MAX_HEALTH = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. 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") 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)
    end
    end
    end
  3. 콜백에서 task.wait() 함수를 호출하여 대기 시간 COOLDOWN을 전달합니다.

  4. Transparency를 다시 설정하고 ENABLED_TRANSPARENCYEnabled를 다시 설정하고 1>true1>로 돌아갑니다.


    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

픽업을 다시 테스트하십시오: 픽업을 터치하면 체력이 회복되고 투명해지고 다시 사용할 수 있습니다.

피드백을 수집할 때 플레이어에게 더 큰 영향을 주고 싶다면 픽업을 수집할 때 픽업에서 밝기를 줄이십시오.

이 체력 픽업을 사용하여 자신의 프로젝트에서 사용하거나 플레이어에게 다른 종류의 파워업을 제공하려면 모양과 효과를 변경하십시오.

최종 코드


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