Samouczki dla średnio zaawansowanych

Utwórz pickup 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 skryptowania, skryptowałeś pojedyncze części, aby stworzyć grywalne sceny. Przy wcześniejszej metodzie, jeśli chciałeś zduplikować części, musiałbyś również zduplikować skrypty. To sprawiałoby, że aktualizacja skryptów byłaby żmudna, ponieważ zmiany musiałbyś wprowadzać w każdym skrypcie z osobna.

W tym samouczku zostanie zastosowany inny wzór do stworzenia kilku pickup'ów zdrowia, z tylko jedną kopią skryptu, który określa zachowanie pickup'u zdrowia. Kiedy pickup zostanie dotknięty, przywróci zdrowie gracza, lekko zbladnie i zostanie wyłączony na krótki czas.

Ustawienia

Na początek będziesz potrzebować części lub modelu, który wykorzystasz jako pickup. Świat przykładowy Showdown Town zawiera wiele pickup'ów zdrowia rozrzuconych po mapie.

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

Każdy pickup zdrowia jest unionem 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 jakiekolwiek inne do mapy, ważne jest, aby upewnić się, że są one również przechowywane w tym folderze.

Przywróć zdrowie

Na początek, skrypt musi przywrócić zdrowie gracza. Ten wzór powinien być ci już 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 innej części, która dotknęła pickup'u oraz samego pickup'u.


    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 za pomocą 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 pickup'ów

Folder zawierający pickup'y zdrowia może nie być załadowany do doświadczenia w momencie, gdy skrypt się uruchamia. Funkcję WaitForChild można wykorzystać do wstrzymania skryptu i uzyskania folderu HealthPickups, gdy się załaduje.

Kiedy wołasz ją na folderze, funkcja GetChildren zwróci tablicę zawartości folderu.

  1. Poniżej 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łana dla każdego pickup'u zdrowia w tablicy. Aby zrobić to efektywnie, użyjemy nowego rodzaju składni pętli.

ipairs jest funkcją, którą można użyć z pętlą for, aby przejść przez każdy element tablicy. Nie musisz określać, gdzie pętla ma 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 będzie zapełniana każdym elementem w tablicy, gdy pętla będzie iterować. Dobrym pomysłem jest nazywanie zmiennej wartości na podstawie tego, 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 jako _. 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ć pickup zdrowia do funkcji onTouchHealthPickup, gdy będziesz podłączać się do zdarzenia Touched.

  1. W pętli for, podłącz zdarzenie Touched do funkcji anonimowej 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 i powinieneś stwierdzić, że pickup zdrowia przywraca twoje zdrowie. Będziesz musiał najpierw zadać obrażenia swojemu graczowi - spróbuj stanąć na wentylacji obok punktu spawn.

Parujący wentyl w przykładowym świecie po prawej stronie punktu spawn

Pasek zdrowia powinien pojawić się w prawym górnym rogu i zniknąć, gdy gracz zostanie wyleczony.

Czas odnowienia pickup'u

Obecnie, pickup będzie nieskończoność leczył każdego gracza, który go dotknie. Byłoby skuteczniej, gdyby mógł być podnoszony tylko raz, z krótkim czasem odnowienia, zanim można będzie go użyć ponownie.

Najpierw musisz zarejestrować, czy pickup jest w okresie odnowienia. Wzór poniżej powinien być ci znany z Fade Trap - tym razem, debounce zostanie osiągnięty przez ustawienie atrybutu na pickupie 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 pickup

Pickup powinien dostarczać wizualnego feedbacku, że jest wyłączony - wspólnym 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 pickup'u 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 ilość do odczekania.

  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

Przetestuj ponownie swój pickup: powinieneś stwierdzić, że kiedy dotkniesz pickup'u, przywraca twoje zdrowie, staje się przezroczysty, a potem wraca, gotowy do użycia ponownie.

Jeśli chcesz uczynić informację zwrotną bardziej zauważalną dla gracza, gdy pickup zostanie zebrany, spróbuj obniżyć jasność PointLight w pickupie, gdy zmienisz przezroczystość.

Spróbuj używać tych pickup'ów zdrowia w swoich własnych projektach lub zmień ich wygląd i efekt, aby nadać graczom inny rodzaj power-up'u.

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
©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.