隨著專案變得複雜,思考腳本的組織變得重要。良好的組織實踐可以確保代碼不在腳本之間重複,或變得難以管理。
一種更好的組織和重用代碼的方法是使用 模組腳本,這是一種獨特的腳本類型,存儲一組旨在實現特定目的的函數和變數,例如管理玩家金錢或敵人。模組腳本中的代碼可以被其他腳本使用。這樣,當玩家完成任務或找到道具時,你可以從多個不同的腳本中調用同一個給予硬幣的函數。
通過將常用的代碼存儲在模組腳本中,可以更輕鬆地維護和組織代碼,因為只需對一個模組腳本進行更改,而不必更新多個腳本。
模組腳本基本知識
模組腳本實際上是一種與腳本對象不同的獨立對象。在 Roblox 中,模組腳本可以用 紫色 圖標表示。
創建模組腳本
模組腳本通常放置在 ServerScriptService 中,當被伺服器端腳本使用時,而當被客戶端本地腳本(如 GUI 互動)使用時,則放置在 ReplicatedStorage 中。
- 在 ServerScriptService 中創建一個 ModuleScript。

模組腳本的結構
創建時,每個模組腳本都以以下代碼開始:
local Module = {}return Module
行 local Module = {} 創建了一個表格,或代碼容器,模組的共享函數和變數可以存儲在其中。這個表格應該被重命名為模組的用途,例如 RewardManager 或 ParticleController。與其他變數使用駝峰式命名(如 myVariable)不同,模組表格建議使用大寫首字母的駝峰式命名(MyModule)。
local RewardManager = {}return RewardManager
為了讓其他腳本可以使用模組的非本地函數或變數,每個模組結尾都會返回 MyModule。每當另一個腳本試圖從模組獲取代碼時,返回將允許該腳本訪問存儲在模組表格中的代碼。
添加到模組腳本
要將一個函數或變數添加到模組中,這樣可以在另一個腳本中使用,請輸入模組表格的名稱,後跟一個點和函數或變數的名稱,如 TestModule.myVariable。使用點運算符是將代碼添加到表格的另一種方法,使其他腳本可以在返回模組表格時訪問該代碼。
local TestModule = {}
-- 將變數添加到 'TestModule' 表格
TestModule.myVariable = 100
-- 將函數添加到 'TestModule' 表格
function TestModule.doTask(player)
-- 占位符代碼
end
return TestModule
模組腳本中的範圍
要在外部腳本中使用模組函數或變數,不要 輸入 local。
在變數和函數前面輸入 local 意味著它們 僅 供該腳本使用。雖然這對於大多數腳本來說是一種良好的實踐,可以減少錯誤和故障排除,但你不能將模組腳本的函數和變數設為本地。
任何僅由該模組腳本使用的代碼仍應包括 local。例如,下面的代碼包括本地變數 difficultyModifier,該變數僅能在該模組腳本中使用,以及函數 getCoinReward(),該函數可以在模組外的腳本中使用。
local RewardManager = {}
-- 僅在模組腳本中使用
local rewardCoins = 50
-- 僅在模組腳本中使用
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- 在其他腳本中使用
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
在其他腳本中使用模組
模組腳本本身無法運行代碼——它需要使用關鍵字 require() 在另一個腳本中加載。函數 require() 接受一個參數,即模組腳本在資源管理器中的位置。
要使用模組,在另一個腳本中,將變數設置為 require(moduleScript)。
local MyModule = require(ServerStorage.ModuleScript)
現在,變數 MyModule 包含在該模組腳本中創建的模組表格。要使用該表格中的函數和變數,請輸入變數名稱,後跟一個點,然後是該模組腳本中要使用的確切名稱,如 MyModule.myFunction()。當腳本運行並到達該行時,它將訪問存儲在模組表格中的特定函數或變數。
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
RewardManager 示例
ModuleScript - RewardManager
local RewardManager = {}
-- 僅在模組腳本中使用
local rewardCoins = 50
-- 僅在模組腳本中使用
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- 在其他腳本中使用
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- 加載模組腳本local RewardManager = require(ServerStorage.RewardManager)-- 從模組腳本調用函數local coins = RewardManager.getCoinReward("easy")print("應該獎勵 " .. coins .. " 硬幣")
常見故障排除
這裡的一些提示解決了使用模組腳本時的常見問題。請記住,模組腳本可能是一個複雜的主題,包含更多細節。欲了解更多詳情,請參閱這本更技術性的指南 模組腳本。
問題: 獲得包含:"無限等待可能" 或 "不是有效的成員" 的錯誤訊息。
- 檢查加載模組腳本的拼寫。 require() 必須包括模組腳本的確切路徑和拼寫,這可能與模組表格的名稱不同。
問題: 獲得包含:"嘗試索引全局" 的錯誤訊息。
- 在任何使用模組腳本的腳本中,確保使用函數 require() 加載它。如果沒有,那個腳本將無法使用模組腳本中的函數和變數。
總結
模組腳本 在 Roblox 中是程式設計師用來組織和重用代碼的一種方法。模組腳本通常存儲在 ServerStorage 中(或 ReplicatedStorage 用於基於客戶端的交互)。從那裡,其他腳本能夠調用存儲在該模組腳本中的函數和變數。
例如,一個經驗可能會因玩家收集物品而獎勵點數。模組腳本可以處理贈送點數的代碼。然後,不同類型物品的腳本只需調用模組腳本函數。這減少了在腳本之間重用代碼的需求,使代碼更易於理解和維護。