Teraz, gdy masz 3D świat, czas dodać swój pierwszy skrypt. W tej sekcji stworzysz mechanikę zbierania monet, która pozwala graczom zbierać monety i tymczasowo dezaktywować monety po ich zebraniu.
Stwórz monety
Zanim będziesz mógł coś skryptować, musisz mieć obiekty zastępcze w świecie, które będą używane jako twoje monety. Podobnie jak platformy podwodne, które stworzyłeś w poprzedniej sekcji, monety mogą być prostymi obiektami Part.
Stwórz monetyW Workspace > World, stwórz nowy folder o nazwie Monety.Wewnątrz folderu Monety, stwórz cylinder Part o nazwie Moneta z kolorem BrickColor ustawionym na Złoty, materiałem ustawionym na Metal, rozmiar 0.6, 8, 4, i orientacją 90, 0, 0.Wyłącz CanCollide i włącz Anchored.Następnie zduplikuj element Moneta kilka razy i rozrzuć duplikaty po wyspie i na platformach, aby były osiągalne z poziomów platform podwodnych.Każde duplikat nazwij Moneta.
Stwórz skrypt
Następnie sprawisz, że monety będą reagować na graczy. Silnik Roblox może wykryć, gdy coś dotyka monety, ale musisz użyć skryptu, aby zdefiniować, jak moneta powinna zareagować.
Stwórz CoinServiceW ServerScriptService stwórz skrypt o nazwie CoinService z następującym kodem:```lua-- Inicjalizacja usług i zmiennychlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Definiowanie handlera zdarzeńlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Gracz dotknął monetycoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Gracz zebrał monetę")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Ustawianie nasłuchiwaczy zdarzeńfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Teraz, gdy gracz dotyka monety, moneta znika na 10 sekund, a dziennik wyjściowy drukuje Gracz zebrał monetę.
Następujące sekcje opisują, jak działa skrypt w większych szczegółach.
Inicjalizuj usługi i zmienne
Podobnie jak w wielu kodach, które prawdopodobnie pisałeś w innych językach, definiujesz zmienne, których potrzebujesz później, na początku skryptu. Nasz kod wykonuje następujące czynności:
- Uzyskiwanie odniesień do wszystkich monet - Skrypt następnie przeszukuje 3D workspace w celu uzyskania wszystkich odniesień do obiektów monet za pomocą metody GetChildren(). Ta metoda zwraca tablicę zawierającą wszystko, co jest zgrupowane z obiektem, z którym jest związana, którym w tym przypadku jest folder Workspace.World.Coins, który stworzyłeś wcześniej.
- Definiuje zmienną globalną - Zmienna COOLDOWN jest używana później do zdefiniowania, jak długo dezaktywować monetę po jej zebraniu.
Inicjalizowanie usług i zmiennychlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Definiuje handler zdarzeń
Silnik Roblox fizycznie symuluje 3D świat i obsługuje wiele logiki dotyczącej zdarzeń związanych z renderowaniem, fizyką i siecią. Kiedy chcesz skryptować swoją własną logikę podczas niektórych z tych wydarzeń, możesz nasłuchiwać i je obsługiwać, pozwalając silnikowi na resztę. W tym przypadku nasłuchujesz i obsługujesz zdarzenia związane z dotykaniem monet. Skrypt definiuje logikę obsługi tego zdarzenia w metodzie onCoinTouched(), która wykonuje następujące czynności:
- Wykrywa, czy moneta jest włączona - Każda Instance ma atrybut boolean Enabled, który definiuje, czy obiekt istnieje w 3D świecie. Możesz uzyskać atrybuty instancji za pomocą metody GetAttribute().
- Wykrywa, czy gracz dotknął monety - Jeśli moneta jest włączona, metoda używa usługi gracza, aby sprawdzić, czy obiekt, który dotknął monety, był rzeczywiście graczem. Kiedy występuje zdarzenie dotyku, silnik Roblox przekazuje obiekt, który dotknął monety jako parametr otherPart. Skrypt sprawdza, czy rodzic obiektu otherPart należy do gracza.
- Dezaktywuje monetę, jeśli gracz ją dotknął, i włącza ją ponownie po 10 sekundach - Na koniec, jeśli gracz dotknął monety, metoda dezaktywuje monetę, czeka 10 sekund i ponownie aktywuje monetę do zbierania. task.wait() jest używane zamiast wait(), ponieważ zapewnia lepszą wydajność, nie przerywając całkowicie wykonywania kodu, pozwalając na równoległe uruchamianie zadań w innych wątkach.
Definiowanie handlera zdarzeń
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Gracz dotknął monety
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Gracz zebrał monetę")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
Podłącz handler zdarzeń
Wszystkie symulowane obiekty 3D dziedziczą po BasePart i dlatego mają zdarzenie Touched(). Następująca pętla łączy handler onTouchedEvent() z każdym zdarzeniem dotyku monety, wykonując następujące czynności:
- Pętla przez wszystkie monety - Pętla przez każdą z monet używając ogólnej iteracji.
- Połączenie handlera z zdarzeniem - W każdej iteracji pętli moneta jest włączona domyślnie, więc jest widoczna w 3D świecie podczas początkowego startu gry. Metoda handlera onCoinTouched() jest także podłączona do zdarzenia Touched monety, aby uruchomiła się za każdym razem, gdy zdarzenie występuje. Kiedy silnik wykrywa dotyk, również przekazuje obiekt, który dotknął obiektu, otherPart.
Podłączanie handlera zdarzeń
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
Testuj mechanikę
Wybierz Test z rozwijanego menu i kliknij Graj. Przesuń swoją postać, aby dotknęła monety. Jeśli wszystko działa, moneta znika, okno Wyjściowe drukuje Gracz zebrał monetę, a moneta pojawia się ponownie po 10 sekundach.
