W miarę jak projekty stają się bardziej złożone, ważne jest, aby pomyśleć o tym, jak skrypty są zorganizowane. Dobre praktyki organizacyjne mogą zapewnić, że kod nie jest duplikowany między skryptami ani nie staje się trudny do zarządzania.
Lepszym sposobem na organizację i ponowne użycie kodu są skrypty modułowe, unikalny typ skryptu, który przechowuje zestaw funkcji i zmiennych zaprojektowanych w celu spełnienia wspólnego celu, takiego jak zarządzanie pieniędzmi gracza lub wrogami. Kod w skryptach modułowych może być używany przez inne skrypty. W ten sposób możesz wywołać tę samą funkcję, która przyznaje monety z wielu różnych skryptów, gdy gracz kończy misję lub znajduje przedmiot.
Przechowując często używany kod w skryptach modułowych, ułatwia to utrzymanie i organizację kodu, ponieważ zmiany muszą być wprowadzane tylko w jednym skrypcie modułowym, a nie w wielu skryptach.
Podstawy skryptów modułowych
Skrypty modułowe są w rzeczywistości osobnym obiektem w porównaniu do obiektów skryptów. W Robloxie skrypty modułowe mogą być oznaczone ikoną fioletową.
Tworzenie skryptu modułowego
Skrypty modułowe są zazwyczaj umieszczane w ServerScriptService, gdy są używane przez skrypty po stronie serwera, oraz w ReplicatedStorage, gdy są używane przez lokalne skrypty po stronie klienta (takie jak interakcje GUI).
- Utwórz ModuleScript w ServerScriptService.

Struktura skryptów modułowych
Po utworzeniu każdy skrypt modułowy zaczyna się od poniższego kodu:
local Module = {}
return ModuleLinia local Module = {} tworzy tabelę, czyli kontener kodu, w którym mogą być przechowywane wspólne funkcje i zmienne modułu. Ta tabela powinna być nazwana zgodnie z celem modułu, na przykład RewardManager lub ParticleController. W przeciwieństwie do innych zmiennych, które są zapisywane w camel case (myVariable), tabele modułów zaleca się używać w pascal case i zaczynać od wielkiej litery (MyModule).
local RewardManager = {}
return RewardManagerAby inne skrypty mogły używać nielokalnych funkcji lub zmiennych modułu, każdy moduł kończy się zwrotem MyModule. Kiedy inny skrypt próbuje uzyskać kod z modułu, zwrot pozwala temu skryptowi uzyskać dostęp do kodu przechowywanego w tabeli modułu.
Dodawanie do skryptów modułowych
Aby dodać funkcję lub zmienną do modułu, która może być używana w innym skrypcie, wpisz nazwę tabeli modułu, a następnie kropkę i nazwę funkcji lub zmiennej, jak w TestModule.myVariable. Użycie operatora kropki to inny sposób dodawania kodu do tabeli, co pozwala innym skryptom uzyskać dostęp do tego kodu, gdy tabela modułu jest zwracana.
local TestModule = {}
-- Dodaje zmienną do tabeli 'TestModule'
TestModule.myVariable = 100
-- Dodaje funkcję do tabeli 'TestModule'
function TestModule.doTask(player)
-- Kod zastępczy
end
return TestModuleZakres w skryptach modułowych
Aby funkcja lub zmienna modułu mogła być używana w zewnętrznym skrypcie, nie wpisuj local.
Wpisanie local przed zmiennymi i funkcjami oznacza, że są one tylko użyteczne w tym skrypcie. Chociaż jest to dobra praktyka w większości skryptów w celu redukcji błędów i rozwiązywania problemów, nie możesz uczynić funkcji i zmiennych skryptu modułowego lokalnymi.
Każdy kod używany tylko przez ten skrypt modułowy powinien nadal zawierać local. Na przykład poniższy kod zawiera lokalną zmienną difficultyModifier, która może być używana tylko w tym skrypcie modułowym, oraz funkcję getCoinReward(), która może być używana w skryptach poza modułem.
local RewardManager = {}
-- Użyteczne tylko w skrypcie modułowym
local rewardCoins = 50
-- Użyteczne tylko w skrypcie modułowym
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Użyteczne w innych skryptach
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManagerUżywanie modułów w innych skryptach
Sam skrypt modułowy nie może uruchomić kodu — musi być załadowany w innym skrypcie za pomocą słowa kluczowego require(). Funkcja require() przyjmuje jeden argument, lokalizację skryptu modułowego w Eksploratorze.
Aby użyć modułu, w osobnym skrypcie ustaw zmienną równą require(moduleScript).
local MyModule = require(ServerStorage.ModuleScript)Teraz zmienna MyModule zawiera tabelę modułu utworzoną w tym skrypcie modułowym. Aby używać funkcji i zmiennych z tej tabeli, wpisz nazwę zmiennej, a następnie kropkę i dokładną nazwę tego, co chcesz użyć w tym skrypcie modułowym, jak MyModule.myFunction(). Gdy skrypt się uruchomi i dotrze do tej linii, uzyska dostęp do tej konkretnej funkcji lub zmiennej przechowywanej w tabeli modułu.
local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()Przykład RewardManager
local RewardManager = {}
-- Użyteczne tylko w skrypcie modułowym
local rewardCoins = 50
-- Użyteczne tylko w skrypcie modułowym
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Użyteczne w innych skryptach
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManagerlocal ServerStorage = game:GetService("ServerStorage")
-- Ładowanie skryptu modułowego
local RewardManager = require(ServerStorage.RewardManager)
-- Wywołuje funkcję ze skryptu modułowego
local coins = RewardManager.getCoinReward("easy")
print("Powinno przyznać " .. coins .. " monet")Ogólne rozwiązywanie problemów
Niektóre z poniższych wskazówek dotyczą powszechnych problemów związanych z pracą ze skryptami modułowymi. Pamiętaj, że skrypty modułowe mogą być skomplikowanym tematem z większą ilością niuansów. Aby uzyskać więcej szczegółów, zapoznaj się z tym bardziej technicznym przewodnikiem na temat Skryptów Modułowych.
Problem: Otrzymujesz komunikat o błędzie zawierający: "Możliwe nieskończone oczekiwanie" lub "nie jest prawidłowym członkiem".
- Sprawdź pisownię skryptu modułowego, w którym jest ładowany. require() musi zawierać dokładną ścieżkę i pisownię skryptu modułowego, który może być nazwany inaczej niż tabela modułu.
Problem: Otrzymujesz komunikat o błędzie zawierający: "próba indeksowania globalnego".
- W jakichkolwiek skryptach używających skryptu modułowego upewnij się, że jest on załadowany za pomocą funkcji require(). W przeciwnym razie ten skrypt nie może używać funkcji i zmiennych ze skryptu modułowego.
Podsumowanie
Skrypty modułowe w Robloxie to metoda, którą programiści używają do organizacji i ponownego używania kodu. Skrypt modułowy jest często przechowywany w ServerStorage (lub ReplicatedStorage dla interakcji po stronie klienta). Stamtąd inne skrypty mogą wywoływać funkcje i zmienne przechowywane w tym skrypcie modułowym.
Na przykład, jedna gra może przyznawać punkty graczom za zbieranie obiektów. Skrypt modułowy może obsługiwać kod przyznający punkty. Następnie skrypty dla różnych typów obiektów mogą po prostu wywoływać funkcję skryptu modułowego. To zmniejsza potrzebę ponownego używania kodu między skryptami, co ułatwia zrozumienie i utrzymanie kodu.