W trakcie podstawowych samouczków z Basic Scripting, miałeś skryptowane pojedyncze części, aby stworzyć grywalne sceny. Z poprzednim metodą, jeśli kopiowałbyś części, to również miałbyś duplikowane skrypty. To uczyniłoby aktualizację skryptów nudną, ponieważ zmiany musiały być wykonane skryptem po skrypcie.
W tym samouczku użyto inny wzór, aby stworzyć kilka zdrowotnych pickupów, z jedną kopią tylko skryptu, który określa zachowanie pickupu zdrowia. Gdy pickup jest dotykany, odzyska zdrowie gracza, zaniknie nieco i zostanie wyłączony na krótką chwilę.
Ustawianie
Najpierw potrzebujesz części lub modelu do użycia jako kodeksu podręcznego. Świat Pierwszy przykład miasta zawiera wiele zdrowotnych pickupów rozrzuconych po całej mapie.
Każde zdobycie zdrowia to unia dwóch prostopadłości z zielonym punktem światła w środku. Wszystkie są one przechowywane w jednym katalogu w przestrzeni roboczej nazyającym się HealthPickups , gdzie skrypt będzie szukać ich. Jeśli dodasz więcej do mapy, to niezbędne jest, abyś zapewnił, że są one również przechowywane w tym katalogu.
Odzyskiwanie zdrowia
Aby zacząć, skrypt musi przywrócić zdrowie gracza. Ten wzór powinien być dla Ciebie znany z tutorialu Śmiertelna Lawa.
W ServerScriptService dodaj skrypt nazyający się PickupManager.
W tym skrypcie, zadeklaruj zmienne nazyjące się MAX_HEALTH z wartością 100 .
Utwórz funkcję nazwę onTouchHealthPickup z parami dla pozostałej części, która dotknęła pickup i samy pickup.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endW funkcji, uzyskaj model postaci z rodzica otherPart . Następnie sprawdź, czy ma Humanoid używając FindFirstChildWhichIsA() .
Jeśli ma ona humanoid, ustaw jej właściwość Zdrowia 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
Uzyskanie katalogu pickups
Katalog zawierający zdrowotne podnieśniki zdrowia może nie zostać załadowany do gry do czasu uruchomienia skryptu. WaitForChild można używać do wstrzymania skryptu i uzyskania katalogu zdrowotnych podnieśników zdrowia podczas uruchomienia.
Gdy jest on wzywany na plik, funkcja GetChildren zwraca wielką maszynę czasową zawierającą zawartość pliku.
Podczas gdy pod MAX_HEALTH deklaruj zmienne nazyjące się healthPickupsFolder i użyj funkcji WaitForChild, aby uzyskać HealthPickups katalog z Workspace.
Utwórz zmienne nazyjące się healthPickups, aby zapisać wynik wysł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ętlenie z ipairs
onTouchHealthPickup musi zostać wezwany dla każdego zdrowotnego pickupu w matrycy. Aby to zrobić skutecznie, nowy rodzaj funkcji循环 będzie używany.
ipairs jest funkcją, którą można użyć z for pętli, aby przejść przez każdy element matryki. Nie musisz określać, gdzie zaczyna się i kończy pętla. A for pętli używając ipairs jest zdefiniowany jako następuje:
- Indeks : jest to równoznaczne z zmiennem kontrolnym w regularnej for loop.
- Wartość : zostanie ona wypełniona za każdym elementem w matrycy, gdy cykl będzie się powtarzał. Dobrym pomysłem jest nazwanie zmiennej wartości po tym, co tak naprawdę będzie zawierać.
- Array: : pasuje do funkcji ipairs twojego wymaganego zapisu.
W następnym kodzie nie musisz mieć wskaźnika dla żadnego, więc można go puste z _ . Stwórz dla pętli używając funkcji ipairs, przesyłając 2> healthPickups2>.
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 wymagana funkcja zapisu ustawień, aby przenieść podział zdrowia na funkcję onTouchHealthPickup, gdy łączysz się z wydarzeniem Touched.
W pętli for, połącz wydarzenie dotykane z anonimową funkcją z parametrem nazyającym się otherPart.
Wezwij funkcję onTouchHealthPickups, przesyłając zarówno parametr otherPart jak i parametr healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Sprawdź teraz swój kod i powinieneś zobaczyć, że zdrowotne podniesienie zdrowia przywraca zdrowie. Będziesz musiał najpierw uszkodzić swojego gracza - spróbuj stawać na wentylacji obok punktu wyjścia.
W górnym prawym powinien pojawić się barwnik zdrowia, który zniknie, gdy gracz zostanie uzdrowiony.
Czas odnowienia podnoszenia
Obecnie, podniesienie niezależnie uzdrowi dowolnego gracza, który je dotknie. Byłoby to bardziej skuteczne w grze, jeśli można go podnieść tylko raz, z krótkim czasem odnowienia przed ponownym użyciem.
Najpierw musisz zapisać, czy podniesienie jest w okresie regeneracji. Wzór poniżej powinien być znany z Fading Trap - tym razem, odwrócenie nastąpi poprzez ustawienie atrybutu na zdrowotnym pickupie.
W for loop ustaw nowy tryb o nazwie "Enabled" na true .
Zwróć kod w onTouchHealthPickup w if statement 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łączone przyciski
Pickup powinien zapewnić wizualne powiadomienia, że jest wyłączony - common way to indicate this is to make it slightly transparent.
Oświadcz trzy konstytucje na górze skryptu (nie wahaj się dostosować każdej wartości do swojego ulubionego):
- 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 if statement in onTouchHealthPickup , ustaw Transparency pickupu do DISABLED_TRANSPARENCY , a wartość atrybutu 1> Enabled1> na fałszywą.
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 czekania.
Ustaw Transparency ponownie na ENABLED_TRANSPARENCY i Enabled ponownie na 1> true1> .
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
Sprawdź swój pickup jeszcze raz: powinieneś znaleźć, że gdy dotkniesz pickupu, przywraca twoje zdrowie, staje się przejrzysty i następnie powraca gotowy do użycia ponownie.
Jeśli chcesz uczynić opinię bardziej istotną dla gracza, gdyby zostać zebrana, spróbuj obetnij jasność światła kropkowego w zbieraniu, gdy zmienisz przejrzystość.
Spróbuj użyć tych zdrowotnych pickupów w swoich własnych projektach, lub zmień wygląd i efekt, aby dać innemu rodzaj power-up swoim graczom.
Kod koń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