Podczas samouczków z podstawowego programowania skryptów skryptowałeś poszczególne części, aby stworzyć odtwarzalne sceny.W poprzedniej metodzie, jeśli miałbyś powielić części, miałbyś także powielone skrypty.Spowodowałoby to uciążliwe aktualizowanie skryptów, ponieważ zmiany musiałyby być dokonywane skrypt po skrypcie.
W tym samouczku zostanie użyty inny wzór, aby utworzyć wiele punktów odbioru zdrowia, z tylko jedną kopią skryptu, który określa zachowanie odbioru zdrowia.Gdy dotknięto podniesienia, przywróci zdrowie gracza, lekko zniknie i zostanie wyłączone na krótki czas.
Ustaw
Najpierw będziesz potrzebował części lub modelu, który możesz użyć jako pickup.Przykład świata Miasta Showdown obejmuje wiele punktów zdrowia rozrzuconych po całej mapie.

Każde odbieranie zdrowia to związek dwóch prostokątnych części z zielonym punktem światła wewnątrz.Wszystkie są przechowywane w jednym folderze w przestrzeni roboczej o nazwie HealthPickups , gdzie skrypt będzie je szukał.Jeśli dodasz więcej do mapy, konieczne jest upewnienie 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ć dla ciebie znany z tutoriala Martwa lawa.
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 podniesienia i samego podniesienia.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endW funkcji, uzyskaj model postaci z rodzica otherPart . Następnie sprawdź, czy ma on Humanoid używając FindFirstChildWhichIsA() .
Jeśli ma humanoida, ustaw jego właściwość Zdrowie 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
Zdobądź katalog odbiorów
Katalog, w którym przechowywane są odczyty zdrowia, może nie zostać załadowany do gry przed uruchomieniem skryptu.WaitForChild można użyć, aby zatrzymać skrypt i uzyskać katalog HealthPickups po jego załadowaniu.
Gdy wezwane z katalogiem, funkcja GetChildren zwróci tablicę zawartości katalogu.
Poniżej MAX_HEALTH, oświadcz zmienną o nazwie healthPickupsFolder i użyj funkcji WaitForChild, aby uzyskać katalog HealthPickups z Workspace.
Utwó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 ipairs
onTouchHealthPickup musi być wezwany za każdym zdobyciem zdrowia w array. Aby to zrobić wydajnie, zostanie użyta nowa sintaksa pętli.
ipairs to funkcja, którą można używać z pętlą for, aby przejść przez każdy element matrycy.Nie musisz określać, gdzie zaczyna się i kończy pętla.Pętla A korzystająca z ipairs jest zdefiniowana jako następująca:
- Indeks : jest to równoznaczne z zmienną kontroli w pętlu regularnym.
- Wartość : zostanie wypełniona każdym elementem w matrycy, gdy pętla się powtarza.Dobrym pomysłem jest nazwanie zmiennej wartości po tym, co rzeczywiście będzie zawierać.
- Array : przekazany jest do funkcji ipairs array, który chcesz przetworzyć.
W następnym kodzie nie potrzebujesz indeksu do niczego, więc można go pozostawić pustym za pomocą _.Stwórz pętelę dla pętle 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
Funkcja zawijająca będzie potrzebna, aby przekazać podniesienie zdrowia do funkcji onTouchHealthPickup przy połączeniu z wydarzeniem Touched.
W pętlu for połącz wydarzenie Touched z anonimową funkcją z parametrem o nazwie otherPart.
Wezwij funkcję onTouchHealthPickups, przekazując oba parametry otherPart i healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Przetestuj swój kod teraz i powinieneś znaleźć, że odzyskanie zdrowia przywraca twoje zdrowie.Najpierw musisz zadać obrażenia swojemu graczowi - spróbuj stanąć na wentylacji obok punktu spawnu.
Pasek zdrowia powinien pojawić się w prawym górnym rogu, który zniknie, gdy gracz zostanie wyleczony.
Podniesienie czasu odnowienia
Obecnie podniesienie wyleczy nieokreśloną liczbę graczy, którzy go dotkną.Będzie skuteczniejszy w grze, jeśli można go podnieść tylko raz, z krótkim czasem odnowienia przed ponownym użyciem.
Najpierw musisz zarejestrować, czy odbiór jest w okresie odnowienia, czy nie.Wzór poniżej powinien być znany z pułapki zanikania - tym razem odblokowanie zostanie osiągnięte poprzez ustawienie atrybutu na podjęciu zdrowia.
W pędzie for ustaw nowy atrybut nazywany do .
Owiń kod w onTouchHealthPickup wewnątrz oświadczenia 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 podnieśanie
Podnieś powinien zapewnić wizualną informację zwrotną, że jest wyłączony - powszechnym sposobem na wskazanie tego jest uczynienie go nieco przejrzystym.
Oświadcz trzy stałe na górze skryptu (czuj się wolny, aby dostosować każdą wartość do swojego gustu):
- 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 oświadczeniu if w onTouchHealthPickup ustaw wartość Transparency odbioru na DISABLED_TRANSPARENCY i 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)endendendWezwij funkcję task.wait(), przekazując COOLDOWN jako ilość do oczekiwania.
Ustaw Transparency powrót do ENABLED_TRANSPARENCY i Enabled powrót do 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
Przetestuj swoje odbieranie ponownie: powinieneś znaleźć to, gdy dotkniesz odbioru, który przywraca twoje zdrowie, staje się przejrzysty, a następnie wraca gotowy do ponownego użycia.
Jeśli chcesz uczynić opinię bardziej wpływową dla gracza, gdy odbiór zostanie zebrany, spróbuj obniżyć jasność Punktu Światła w odbiorze, gdy zmienisz przejrzystość.
Spróbuj używać tych punktów zdrowia w swoich własnych projektach lub zmień wygląd i efekt, aby dać inną rodzaj pomocy swoim graczom.
kodkońcowy
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