Wprowadzenie do skryptów modułowych

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Gdy projekty stają się skomplikowane, ważne staje się pomyślenie o tym, w jaki sposób są zorganizowane skrypty.Dobre praktyki organizacyjne mogą zapewnić, że kod nie jest powielany między skryptami lub staje się trudny do zarządzać.

Lepszym sposobem na zorganizowanie i ponowne wykorzystanie kodu jest skrypt modułu , unikalny rodzaj skryptu, który przechowuje zestaw funkcji i zmiennych przeznaczonych do 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 wezwać tę samą funkcję, która daje monety z wielu różnych skryptów, gdy gracz kończy misję lub znajduje pickup.

Przechowywanie powszechnie używanego kodu w skryptach modułowych ułatwia utrzymywanie i organizowanie kodu, ponieważ zmiany muszą być wprowadzone tylko do jednego skryptu modułowego, a nie aktualizować wielu skryptów.

Podstawy skryptu modułu

Skrypty modułów są w rzeczywistości własnym oddzielnym obiektem w porównaniu do obiektów skryptów.W Roblox skrypty modułu mogą być oznaczone ikona fioletową .

Stwórz skrypt modułu

ModuleScripts są powszechnie umieszczane w ServerScriptService gdy są używane przez skrypty po stronie serwera i ReplicatedStorage gdy są używane przez lokalne skrypty strony klienta (takie jak interakcje z interfejsem GUI).

  1. Stwórz ModuleScript w ServerScriptService .

Struktura skryptów modułowych

Po utworzeniu każdy skrypt modułu zaczyna się od kodu poniżej:


local Module = {}
return Module

Linia local Module = {} tworzy tablicę lub pojemnik kodu, w którym można przechować wspólne funkcje i zmienne modułu.Ta tabela powinna zostać zmieniona na nazwę celu modułu, taką jak RewardManager lub ParticleController.W przeciwieństwie do innych zmiennych, które są wielką literą ( myVariable ), zaleca się stosowanie przypadku pascal i rozpoczynanie od dużej litery ( MyModule ).


local RewardManager = {}
return RewardManager

Więc inne skrypty mogą korzystać z nie-lokalnych funkcji lub zmiennych modułu, każdy moduł kończy się powrotem MyModule.Za każdym razem, gdy inny skrypt próbuje uzyskać kod z modułu, powrót pozwala temu skryptowi uzyskać dostęp do kodu przechowany w tabeli modułu.

Dodaj do skryptów modułu

Aby dodać funkcję lub zmienną do modułu, której można użyć w innym skrypcie, wpisz nazwę tabeli modułu, po której następuje znak zapisu i nazwę funkcji lub zmiennej, tak jak w TestModule.myVariable.Użycie operatora punktu to kolejny sposób dodawania kodu do tabeli, umożliwiający innym skryptom uzyskiwanie tego kodu za każdym razem, gdy jest zwracany modułowy stół.


local TestModule = {}
-- Dodaje zmienną do tabeli 'TestModule'
TestModule.myVariable = 100
-- Dodaje funkcję do tabeli 'TestModule'
function TestModule.doTask(player)
-- kodmiejsceholder
end
return TestModule

Zakres w skryptach modułowych

Aby funkcja lub zmienna modułu została użyta w zewnętrznym skrypcie, nie pisz local .

Wpisanie local przed zmiennymi i funkcjami oznacza, że są one tylko dostępne dla tego skryptu.Chociaż jest to dobra praktyka dla większości skryptów do redukcji błędów i rozwiązywania problemów, nie możesz uczynić funkcji i zmiennych skryptów modułowych lokalnymi.

Każdy kod użyty tylko przez ten skrypt modułu powinien nadal zawierać local .Na instancjakod poniżej zawiera zmienną lokalną difficultyModifier, którą można używać tylko w skrypcie modułu, oraz funkcję getCoinReward(), którą można używać w skryptach poza modułem.


local RewardManager = {}
-- Dostępne tylko w skrypcie modułu
local rewardCoins = 50
-- Dostępne tylko w skrypcie modułu
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Możliwe do użycia w innych skryptach
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager

Użyj modułów w innych skryptach

Samodzielnie skrypt modułu nie może uruchomić kodu — musi zostać załadowany w innym skrypcie za pomocą klucza require().Funkcja require() akceptuje jeden argument, lokalizację skryptu modułu w Explorerze.

Aby użyć modułu, w odrębnym skrypcie, ustaw zmienną równą require(moduleScript).


local MyModule = require(ServerStorage.ModuleScript)

Teraz zmienna MyModule zawiera tabelę modułu utworzoną w tym skrypcie modułu.Aby używać funkcji i zmiennych z tego stołu, wpisz nazwę zmiennej, po której następuje kropka, a dokładną nazwę tego, co należy używać w skrypcie modułu, tak jak MyModule.myFunction().Gdy skrypt zostanie uruchomiony i dotrze do tej linii, będzie mógł uzyskać dostęp do tej konkretnej funkcji lub zmiennej przechowywanej w tabeli modułu.


local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()

Przykład menedżera nagród

ModuleScript - Menadżer nagród

local RewardManager = {}
-- Dostępne tylko w skrypcie modułu
local rewardCoins = 50
-- Dostępne tylko w skrypcie modułu
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Możliwe do użycia w innych skryptach
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Skrypt - Skrypt skrzyni skarbów

local ServerStorage = game:GetService("ServerStorage")
-- Załaduj skrypt modułu
local RewardManager = require(ServerStorage.RewardManager)
--Wezwanie funkcji z kodu modułu
local coins = RewardManager.getCoinReward("easy")
print("Should award " .. coins .. " coins")

Ogólne rozwiązywanie problemów

Niektóre z wskazówek tutaj dotyczą powszechnych problemów podczas pracy z kodami modułów.Pamiętaj, że skrypty modułowe mogą być skomplikowanym tematem z większą niuansem.Aby uzyskać więcej szczegółów, zobacz ten bardziej techniczny przewodnik na temat skryptów modułowych. Problem: Otrzymaj komunikat o błędzie zawierający: "Infinite yield possible" lub "not a valid member".

  • Sprawdź pisownię skryptu modułu, gdzie jest wczytywany.require() musi zawierać dokładną ścieżkę i wymowę skryptu modułu, które mogą być nazywane inaczej niż tabela modułu. Problem: Otrzymaj komunikat o błędzie zawierający: "attempt to index global".

  • W każdym skrypcie używającym skryptu modułu, upewnij się, że zostało ono załadowane za pomocą funkcji require().Jeśli nie, ten skrypt nie może korzystać z funkcji i zmiennych z kodu modułu.

Podsumowanie

Skrypty modułowe w Roblox są metodą, którą programiści używają do organizowania i ponownego wykorzystywania kodu.Skrypt modułu jest często przechowywany w ServerStorage (lub ReplicatedStorage dla interakcji opartych na klientach).Stamtąd inne skrypty mogą wezwać funkcje i zmienne przechowywane w tym module skryptu.

Na instancja, jedna gra może przyznać punkty graczom za zbieranie przedmiotów.Skrypt modułu może obsługiwać kod, aby przyznawać punkty.Następnie skrypty dla różnych typów obiektów mogą po prostu wezwać funkcję skryptu modułu.Zmniejsza to potrzebę ponownego wykorzystywania kodu między skryptami, co ułatwia zrozumienie i utrzymanie kodu.