隨著項目複雜化,就變得重要思考如何組織腳本。良好的組織習慣可以確保代碼在不同的腳本之間不會重複,或者變得很難管理。
組織和重複代碼的更好方法是使用 模組腳本 ,這是一種獨特類型的腳本,儲存一組用於滿足共同目的的功能和變量,例如管理玩家的金錢或敵人。模組腳本內的代碼可以被其他腳本使用。這樣,您可以在玩家完成任務或找到撿起時,呼叫與多個不同腳本提供的相同功能來獲得硬幣。
將常用的代碼存儲在模組腳本中,可以使維護和組織代碼變得更容易,因為只需要對一個模組指令碼進行更改,而不需要更新多個腳本。
模組腳本基礎
模組腳本實際上是與腳本對象分開的自己的對象。在 Roblox 中,模組腳本可以使用紫色 圖示來標示。
創建模組腳指令碼
模組指令碼通常會在 伺服器指令碼服務 中放置,當使用服務器側指令碼時,或在 重複儲存庫 中放置,當使用客戶端本地指令碼 (例如 GUI 互動) 時。
- 在 伺服器腳本服務 中創建一個 ModuleScript 。

模組腳本結構
當創建時,每個模組腳本開始使用以下代碼:
local Module = {}return Module
線 local Module = {} 創建一個表或代碼容器,可以儲存模組的共用功能和變量。此表應該重新命名為模組的目的,例如 RewardManager 或 ParticleController 。與其他 camel 案例()不同,模組表建議使用 pascal 案例並開始大寫()。
local RewardManager = {}return RewardManager
因此,其他腳本可以使用模組的非本地函數或變量,每個模組都以 return MyModule 結束。每當另一個腳本嘗試從模組中獲取代碼時,返回讓該腳本存取模組表內的代碼。
添加到模組腳本
若要將功能或變數新增到模指令碼中,可在其他腳本中使用,請輸入模組表名稱,然後點以及功能或變數名稱,例如在 TestModule.myVariable 中。使用點符運作器是另一種將代碼添加到表中的方法,允許其他腳本隨時存取該代碼,當模組表返回時。
local TestModule = {}
-- 添加變數到「測試模組」表
TestModule.myVariable = 100
-- 新增「測試模組」表的功能
function TestModule.doTask(player)
-- 暫時代碼
end
return TestModule
在模組腳本中範圍
若要將模組功能或變量在外部指令碼本中使用,請不要輸入 。
在變量和函數前輸入 意味著它們只能由此指令碼本使用。雖然這是降低錯誤和故障排除的最佳做法,大多數腳本,但你不能將模組腳本功能和變量作為本地。
任何使用 只有 由該模組腳本使用的代碼仍應包含 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()
獎勵管理員範例
模組腳本 - 獎勵管理器
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
腳本 - 寶箱腳本
local ServerStorage = game:GetService("ServerStorage")-- 載入模組腳指令碼local RewardManager = require(ServerStorage.RewardManager)--從模指令碼腳本呼叫功能local coins = RewardManager.getCoinReward("easy")print("Should award " .. coins .. " coins")
一般故障排除
這裡的一些提示解決了使用模組腳本時常見的問題。請記住,模組腳本可能是一個更複雜的主題,包含更多細節。欲了解更多詳情,請參閱此更多技術指南:模組腳本。 問題:: 獲得包括:"Infinite yield possible" 或 "not a valid member" 的錯誤訊息。
檢查模組腳本在載入時的拼寫。require()必須包含模組腳指令碼的準確路徑和拼寫,可能與模組表的名稱不同。 問題:: 獲得包含以下錯誤訊息的錯誤訊息:"attempt to index global"。
在使用模組腳指令碼的任何腳本中,請確保使用功能 require() 來載入腳本。如果不是,該腳本無法使用模組腳指令碼的函數和變量。
總結
Roblox 中的模組腳本 是程式碼編寫者使用來組織和重複程式碼的方法。模組腳本通常會儲存在伺服器儲存 (或客戶端互動的 ReplicatedStorage) 中。從那裡,其他腳本可以呼叫儲存在該模組指令碼中的函數和變量。
例個體、實例,一個遊戲可以獎勵玩家收集物品的點數。模組腳本可以處理代碼來提供點數。然後,不同類型的對象的腳本只需呼叫模組腳本功能。這減少了在腳本之間重複使用代碼的需要,使代碼更容易理解和維護。