Stwórz podnoszenie zdrowia

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

W trakcie podstawowych samouczków skryptowych stworzyłeś pojedyncze części, aby stworzyć grywalne sceny. Przy poprzedniej metodzie, jeśli miałbyś duplikować części, tworzyłbyś wtedy również duplikaty skryptów. Uaktualnianie tych skryptów byłoby nużące, ponieważ zmiany musiałyby być wprowadzane jeden skrypt po drugim.

W tym samouczku zostanie użyty inny wzorzec do stworzenia licznych podnoszeń zdrowia, z tylko jedną kopią skryptu, który określa zachowanie podnoszenia zdrowia. Gdy podnoszenie jest dotknięte, przywróci ono zdrowie gracza, lekko się zfade'uje i zostanie wyłączone na krótki czas.

Konfiguracja

Na początku potrzebujesz części lub modelu, który posłuży jako podnoszenie. Przykładowy świat Showdown Town zawiera wiele podnoszeń zdrowia rozsianych po mapie.

Opcja Edytuj w Studio z głównej strony doświadczenia

Każde podnoszenie zdrowia to zespół dwóch prostokątnych części z zielonym PointLight wewnątrz. Wszystkie są przechowywane w jednym folderze w Workspace o nazwie HealthPickups, w którym skrypt będzie ich szukać. Jeśli dodasz więcej do mapy, koniecznie upewnij się, że również są one przechowywane w tym folderze.

Przywróć zdrowie

Na początek skrypt musi przywrócić zdrowie gracza. Ten wzorzec powinien być Ci znany z samouczka Deadly Lava.

  1. W ServerScriptService, dodaj skrypt o nazwie PickupManager.

  2. W tym skrypcie zadeklaruj stałą o nazwie MAX_HEALTH z wartością 100.

  3. Stwórz funkcję o nazwie onTouchHealthPickup z parametrami dla drugiej części, która dotknęła podnoszenia, oraz samego podnoszenia.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. W funkcji uzyskaj model postaci z rodzica otherPart. Następnie sprawdź, czy ma on Humanoid za pomocą FindFirstChildWhichIsA().

  5. Jeśli ma humanoida, ustaw ich właściwość Health na 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

Uzyskaj folder podnoszeń

Folder zawierający podnoszenia zdrowia może nie być załadowany do gry w momencie uruchamiania skryptu. WaitForChild można użyć do wstrzymania skryptu i uzyskania folderu HealthPickups, gdy zostanie załadowany.

Gdy jest wywoływana na folderze, funkcja GetChildren zwróci tablicę zawartości folderu.

  1. Pod MAX_HEALTH zadeklaruj zmienną o nazwie healthPickupsFolder i użyj funkcji WaitForChild, aby uzyskać folder HealthPickups z Workspace.

  2. Stwórz zmienną o nazwie healthPickups, aby przechować wynik wywołania funkcji GetChildren na 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

Pętla z użyciem ipairs

onTouchHealthPickup musi być wywołane dla każdego podnoszenia zdrowia w tablicy. Aby to zrobić efektywnie, zostanie użyta nowa składnia pętli.

ipairs to funkcja, która może być użyta z pętlą for, aby przejść przez każdy element tablicy. Nie musisz określać, gdzie pętla się zaczyna i kończy. Pętla for przy użyciu ipairs jest definiowana w następujący sposób:

for index, value in ipairs(array) do

  • Indeks: to jest równoważne zmiennej kontrolnej w zwykłej pętli for.
  • Wartość: to zostanie zapełnione każdym elementem w tablicy podczas iteracji pętli. Dobrze jest nazwać zmienną wartości zgodnie z tym, co będzie zawierać.
  • Tablica: tablica, którą chcesz iterować, jest przekazywana do funkcji ipairs.

W poniższym kodzie nie potrzebujesz indeksu do niczego, więc można go pozostawić pustym z _. Stwórz pętlę for używając funkcji ipairs, przekazując 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

Będzie potrzebna funkcja opakowująca, aby przekazać podnoszenie zdrowia do funkcji onTouchHealthPickup, gdy będzie podłączone do zdarzenia Touched.

  1. W pętli for, połącz zdarzenie Touched z anonimową funkcją z parametrem o nazwie otherPart.

  2. Wywołaj funkcję onTouchHealthPickups, przekazując zarówno parametr otherPart, jak i healthPickup.


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

Teraz przetestuj swój kod, a powinieneś zauważyć, że podnoszenie zdrowia przywraca twoje zdrowie. Najpierw musisz uszkodzić swojego gracza - spróbuj stanąć na wentylacji obok punktu startowego.

Dymiąca wentylacja w przykładowym świecie po prawej stronie punktu startowego

Pasek zdrowia powinien pojawić się w prawym górnym rogu, który zniknie, gdy gracz zostanie uzdrowiony.

Czas odnowienia podnoszenia

Obecnie podnoszenie będzie nieograniczenie uzdrawiać każdego gracza, który go dotknie. W grze byłoby to bardziej efektywne, gdyby można je było podnieść tylko raz, z krótkim czasem odnowienia przed ponownym użyciem.

Najpierw musisz zarejestrować, czy podnoszenie jest w okresie czasu odnowienia. Wzorzec poniżej powinien być Ci znany z samouczka Fade Trap – tym razem debouncing zostanie osiągnięte przez ustawienie atrybutu na podnoszeniu zdrowia.

  1. W pętli for, ustaw nowy atrybut o nazwie "Enabled" na true.

  2. Owiń kod wewnątrz onTouchHealthPickup w instrukcję if z warunkiem 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

Wyłącz podnoszenie

Podnoszenie powinno dostarczać wizualnej informacji zwrotnej, że jest wyłączone - powszechnym sposobem wskazania tego jest uczynienie go nieco przezroczystym.

  1. Zadeklaruj trzy stałe na początku skryptu (możesz dostosować każdą wartość według własnych upodobań):

    • 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. W instrukcji if w onTouchHealthPickup ustaw Transparency podnoszenia na DISABLED_TRANSPARENCY, a wartość atrybutu Enabled na fałsz.


    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. Wywołaj funkcję task.wait(), przekazując COOLDOWN jako czas do oczekiwania.

  4. Ustaw Transparency z powrotem na ENABLED_TRANSPARENCY oraz Enabled z powrotem na true.


    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

Ponownie przetestuj swoje podnoszenie: powinieneś zauważyć, że gdy dotkniesz podnoszenia, przywraca twoje zdrowie, staje się przezroczyste, a następnie wraca gotowe do ponownego użycia.

Jeśli chcesz, aby informacje zwrotne były bardziej wpływowe dla gracza, gdy podnoszenie jest zbierane, spróbuj zmniejszyć jasność PointLight w podnoszeniu, gdy zmieniasz przezroczystość.

Spróbuj użyć tych podnoszeń zdrowia w swoich własnych projektach lub zmień wygląd i efekt, aby nadać inną moc dla swoich graczy.

Końcowy kod


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

Na tej stronie