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.

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.
W ServerScriptService, dodaj skrypt o nazwie PickupManager.
W tym skrypcie zadeklaruj stałą o nazwie MAX_HEALTH z wartością 100.
Stwórz funkcję o nazwie onTouchHealthPickup z parametrami dla drugiej części, która dotknęła podnoszenia, oraz samego podnoszenia.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endW funkcji uzyskaj model postaci z rodzica otherPart. Następnie sprawdź, czy ma on Humanoid za pomocą FindFirstChildWhichIsA().
Jeśli ma humanoida, ustaw ich właściwość Health na MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
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.
Pod MAX_HEALTH zadeklaruj zmienną o nazwie healthPickupsFolder i użyj funkcji WaitForChild, aby uzyskać folder HealthPickups z Workspace.
Stwórz zmienną o nazwie healthPickups, aby przechować wynik wywołania funkcji GetChildren na 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
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:
- 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.
W pętli for, połącz zdarzenie Touched z anonimową funkcją z parametrem o nazwie otherPart.
Wywołaj funkcję onTouchHealthPickups, przekazując zarówno parametr otherPart, jak i healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.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.
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.
W pętli for, ustaw nowy atrybut o nazwie "Enabled" na true.
Owiń kod wewnątrz onTouchHealthPickup w instrukcję if z warunkiem 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
Wyłącz podnoszenie
Podnoszenie powinno dostarczać wizualnej informacji zwrotnej, że jest wyłączone - powszechnym sposobem wskazania tego jest uczynienie go nieco przezroczystym.
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 = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")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") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendWywołaj funkcję task.wait(), przekazując COOLDOWN jako czas do oczekiwania.
Ustaw Transparency z powrotem na ENABLED_TRANSPARENCY oraz Enabled z powrotem na true.
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
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