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 dotyczących skryptów, skryptowałeś poszczególne części, aby stworzyć grywalne sceny. Przy poprzedniej metodzie, jeśli skopiujesz części, będziesz miał również skopiowane skrypty. Utrudniłoby to aktualizację skryptów, ponieważ zmiany musiałyby być wprowadzane skrypt po skrypcie.

W tym samouczku zostanie użyty inny wzór do stworzenia kilku podnoszeń zdrowia, z tylko jedną kopią skryptu, który określa zachowanie podnoszenia zdrowia. Gdy podnoszenie zostanie dotknięte, przywróci zdrowie gracza, lekko zniknie i zostanie wyłączone na krótki czas.

Ustawienia

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

Opcja Edytuj w Studio z głównej strony gry

Każde podnoszenie zdrowia to unia dwóch prostokątnych części z zielonym światłem punktowym 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, ważne jest, aby upewnić się, że są również przechowywane w tym folderze.

Przywróć zdrowie

Na początek skrypt musi przywrócić zdrowie gracza. Ten wzór 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 Humanoid używając FindFirstChildWhichIsA().

  5. Jeśli ma humanoida, ustaw jego 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 uruchomienia skryptu. WaitForChild można użyć do wstrzymania skryptu i uzyskania folderu HealthPickups, gdy się załaduje.

Gdy wywołasz 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 ipairs

onTouchHealthPickup musi być wywoływana 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żywana z pętlą for do przechodzenia przez każdy element tablicy. Nie musisz określać, gdzie pętla się zaczyna i kończy. Pętla for używająca ipairs jest zdefiniowana w następujący sposób:

for index, value in ipairs(array) do

  • Indeks: to odpowiada zmiennej kontrolnej w zwykłej pętli for.
  • Wartość: ta zmienna będzie wypełniana każdym elementem w tablicy, gdy pętla iteruje. Dobrze jest nazwać zmienną wartości po 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 zostawić 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 łączysz się z wydarzeniem 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

Przetestuj teraz swój kod, a powinieneś zauważyć, że podnoszenie zdrowia przywraca twoje zdrowie. Musisz najpierw uszkodzić swojego gracza - spróbuj stanąć na wentylacji obok punktu odrodzenia.

Parująca wentylacja w przykładowym świecie po prawej stronie punktu odrodzenia

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

Czas odnowienia podnoszenia

Obecnie podnoszenie będzie nieograniczenie leczyć każdego gracza, który go dotknie. Byłoby bardziej efektywne, gdyby mogło być podnoszone tylko raz, z krótkim czasem odnowienia przed ponownym użyciem.

Najpierw musisz zarejestrować, czy podnoszenie jest w okresie odnowienia. Wzór poniżej powinien być ci znany z Fade Trap - tym razem, debouncing zostanie osiągnięty 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 zapewniać wizualne informacje zwrotne, że jest wyłączone - powszechnym sposobem na to jest uczynienie go lekko 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 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. Wywołaj funkcję task.wait(), przekazując COOLDOWN jako czas oczekiwania.

  4. Ustaw Transparency z powrotem na ENABLED_TRANSPARENCY i 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

Przetestuj swoje podnoszenie ponownie: 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 informacja zwrotna była bardziej wpływowa dla gracza, gdy podnoszenie zostanie zebrane, spróbuj zmniejszyć jasność światła punktowego w podnoszeniu, gdy zmieniasz przezroczystość.

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

Ostateczny 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
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.