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 wyłącza monety po ich zebraniu.
Stwórz monety
Zanim będziesz mógł cokolwiek skryptować, musisz mieć obiekty zastępcze w świecie, które będą używane jako twoje monety. Podobnie jak platformy z poprzedniej sekcji, monety mogą być prostymi obiektami Part.
W Workspace > World, stwórz nowy folder o nazwie Coins.
Wewnątrz folderu Coins, stwórz cylindryczny Part o nazwie Coin z BrickColor ustawionym na Gold, Material ustawionym na Metal, Size 0.6, 8, 4, oraz Orientation 90, 0, 0.
Wyłącz CanCollide i włącz Anchored.
Następnie skopiuj część Coin kilka razy i rozrzuć duplikaty po wyspie i na platformach, aby były dostępne z poziomów morskich stosów.
Zachowaj każdą kopię nazwaną Coin.Stwórz skrypt
Następnie sprawisz, że monety będą reagować na graczy. Silnik Roblox może wykryć, kiedy coś dotyka monety, ale musisz użyć skryptu, aby zdefiniować, jak moneta powinna reagować.
W ServerScriptService, stwórz skrypt o nazwie CoinService z następującym kodem:
```lua
-- Inicjalizacja usług i zmiennych
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- Definiowanie obsługi 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
-- Ustawianie nasłuchiwaczy zdarzeń
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```Teraz, gdy gracz dotknie monety, moneta znika na 10 sekund, a dziennik wyjściowy drukuje Gracz zebrał monetę.
Poniższe 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 zapytuje 3D workspace o wszystkie odniesienia do obiektów monet za pomocą metody GetChildren(). Ta metoda zwraca tablicę zawierającą wszystko, co jest rodzicem obiektu, z którym jest związana, co w tym przypadku jest folderem Workspace.World.Coins, który stworzyłeś wcześniej.
- Definiuje zmienną globalną - Zmienna COOLDOWN jest używana później do określenia, jak długo wyłączyć monetę po jej zebraniu.
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...Definiuj obsługę zdarzeń
Silnik Roblox fizycznie symuluje 3D świat i obsługuje wiele logiki związanej z obsługą zdarzeń związanych z renderowaniem, fizyką i siecią. Kiedy chcesz skryptować swoją własną logikę podczas niektórych z tych zdarzeń, możesz nasłuchiwać i obsługiwać je, pozwalając silnikowi zająć się 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 otherPart należy do gracza.
- Wyłącza monetę, jeśli gracz ją dotknął, i ponownie ją włącza po 10 sekundach - Na koniec, jeśli gracz dotknął monety, metoda wyłącza monetę, czeka 10 sekund, a następnie ponownie włącza monetę do zbierania. task.wait() jest używane zamiast wait(), ponieważ zapewnia lepszą wydajność, nie wstrzymując całkowicie wykonania kodu, pozwalając na równoległe wykonywanie zadań w innych wątkach.
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
endPołącz obsługę zdarzeń
Wszystkie symulowane obiekty 3D dziedziczą z BasePart i dlatego mają zdarzenie Touched(). Poniższa pętla łączy obsługę 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 za pomocą ogólnej iteracji.
- Łączy obsługę z zdarzeniem - W każdej iteracji pętli moneta jest domyślnie włączona, więc jest widoczna w 3D świecie podczas początkowego uruchomienia gry. Metoda obsługi onCoinTouched() jest również połączona z zdarzeniem Touched monety, aby uruchamiała się za każdym razem, gdy zdarzenie występuje. Kiedy silnik wykrywa dotyk, przekazuje również obiekt, który dotknął obiektu, otherPart.
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
endPrzetestuj mechanikę
Wybierz Test z rozwijanego menu i kliknij Play. Przesuń swoją postać, aby dotknąć monety. Jeśli wszystko działa, moneta znika, okno Output drukuje Gracz zebrał monetę, a moneta pojawia się ponownie po 10 sekundach.
