Teraz, gdy masz świat 3D, ten rozdział samouczka nauczy cię, jak dodać swój pierwszy skrypt, aby określić mechanizm zbierania monet.Mechanizm ten pozwala graczom zbierać monety i wyłącza zbieranie monety, jeśli została niedawno zebrana.
Stwórz monety
Zanim będziesz mógł zapisać coś w skrypcie, musisz mieć obiekty placeholder na świecie, które będą używane jako twoje monety.Podobnie jak platformy stosu morza, które stworzyłeś w poprzedniej sekcji, monety mogą być prostymi Part obiektami.
Aby utworzyć monety:
W oknie Eksploratora dodaj nową kartę do katalogu Świat , a następnie zmień nazwę na Monety .
Włóż część cylindra do katalogu Monety , a następnie zmień nazwę części na Moneta .
Wybierz część, a następnie w oknie Właściwości ,
- Ustaw Kolor cegły na Złoto .
- Ustaw Materiał na Metal .
- Ustaw rozmiar na .
- Wyłącz Możliwość kolizji .Oznacza to, że silnik wie, że inne części mogą przejść przez monetę, co oznacza, że gracze mogą przechodzić przez monety, aby je zebrać.
- Włącz zakotwiczone .Oznacza to, że silnik nigdy nie zmieni pozycji monety z powodu jakiejkolwiek symulacji związanej z fizyką, co oznacza, że gracze mogą dotknąć monety bez wpływu na jej lokalizację.
Powtórz kilka monet i umieść je wokół mapy do celów testowych.
Twoje części cylindra teraz wyglądają jak monety i zapobiegają symulacji fizycznej, ale musisz dodać logikę do monet, aby gracze mogli je zebrać.
Stwórz skrypt
Aby monety były zbieralne, chcesz reagować na dotyk graczy.Silnik Roblox może powiadomić Cię, gdy coś dotknie monety, ale musisz to zadeklarować w skrypcie.Aby utworzyć skrypt:
W oknie Eksploratora przewiń nad ServerScriptService i kliknij przycisk ⊕ . Wyświetla się menu kontekstowe.
Z menu kontekstowego wybierz Skrypt .Nowa skrypt wyświetla się pod ServerScriptService , który mówi silnikowi, aby uruchomił skrypt na serwerze i zapobiega dostępowi klientów do kodu.
Zmień nazwę skryptu na CoinService .
Zastąp domyślny kod następującym kodem:
-- 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 obsługi zdarzenialocal 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("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Konfiguracja słuchaczy wydarzeńfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endTeraz, za każdym razem, gdy gracz dotknie monety, moneta znika na 10 sekund, a dziennik wyjściowy drukuje Player collected coin .
Wyjaśnienie koduNastępujące sekcje opisują, jak skrypt działa w bardziej szczegółowy sposób.
Uruchom usługi i zmienne
Podobnie jak w przypadku wielu kodów, które prawdopodobnie napisałeś w innych językach, określasz zmienne, których potrzebujesz później na górze skryptu.Nasz kod robi obserwuje:
Uzyskaj odniesienia do wszystkich monet - Skrypt następnie wyszukuje przestrzeń roboczą 3D dla wszystkich odniesień do obiektów monety za pomocą metody GetChildren().Ta metoda zwraca tablicę zawierającą wszystko powiązane z obiektem, z którym jest powiązana, co w tym przypadku jest katalogiem Workspace.World.Coins, który utworzyłeś wcześniej.
Definiuje globalną zmienną - zmienna COOLDOWN jest używana później do określenia, jak długo wyłączyć monetę po jej zebraniu.
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...
Określ obsługę zdarzenia
Silnik Roblox fizycznie symuluje świat 3D i obsługuje dużo logiki związanej z obsługą wydarzeń związanych z renderowaniem, fizyką i sieciowaniem.Kiedy jesteś zainteresowany programowaniem własnej logiki podczas niektórych z tych wydarzeń, możesz je słuchać i obsługiwać, pozostawiając silnikowi resztę.W tym przypadku słuchasz i obsługujesz zdarzenia związane z dotyknięciem monet.Skrypt określa logikę obsługi tego wydarzenia w metodzie onCoinTouched(), która wykonuje obserwujeczynności:
Wykrywa, czy moneta jest włączona - Każdy ma atrybut booleanowy, który określa, czy obiekt istnieje w świecie 3D, czy nie.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.Gdy wystąpi zdarzenie dotykowe, 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ą aktywuje po 10 sekundach - Wreszcie, jeśli gracz dotknął monety, metoda wyłącza monetę, czeka 10 sekund, a następnie ponownie aktywuje monetę do kolekcja.task.wait() jest używany zamiast wait(), ponieważ zapewnia lepsze osiągi, nie wstrzymując całkowicie wykonania kodu, umożliwiając wykonywanie zadań w innych wątkach równocześnie.
Definiowanie menedżera 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("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
Połącz obsługę zdarzenia
Wszystkie symulowane obiekty 3D dziedziczą od BasePart i dlatego mają wydarzenie Touched().Poniższy cykl łączy menadżera onTouchedEvent() z wydarzeniem dotknięcia każdej monety poprzez wykonanie obserwuje:
Pętla przez wszystkie monety - Pętla przez każdą z monet za pomocą ogólnej iteracji.
Połącz obsługę z wydarzeniem - W każdej iteracji pętla włącza domyślnie monetę, więc jest ona widoczna w świecie 3D podczas początkowego uruchomienia doświadczenia.Metoda obsługi onCoinTouched() jest również połączona z wydarzeniem Touched monety, aby uruchamiała się za każdym razem, gdy wystąpi to wydarzenie.Kiedy silnik wykrywa dotknięcie, przekazuje również obiekt, który dotknął obiektu, otherPart .
Łączenie menedżera zdarzeńfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Przetestuj mechanikę
Nadszedł czas, aby sprawdzić, czy mechanizm kolekcji monet działa tak, jak zakładano. Aby przetestować swoje doświadczenia:
Na pasku narzędzi kliknij przycisk Graj . Studio wchodzi w tryb testowania gry.
Przesuń postać, aby dotknąć monety.Jeśli twoje skrypty działają poprawnie, okno Wyjście wyświetla Player collected coin, a moneta znika na 10 sekund przed ponownym pojawieniem się.