隨著項目變得越來越複雜,變得重要考慮程式碼是如何組織的。良好的組織習慣可以確保程式碼不會在項目之間重複,或變得很難管理。
一種更好的方法來組織和重用代碼是使用 模組指令碼 ,這是一種獨特的指令碼類型,可以儲存一組用於達到共用目的的功能和變量。 模組指令碼內的代碼可以由其他指令碼使用。 這樣,您就可以每次使用不同的指令碼來尋找錢幣或敵人。
將常常使用的代碼存儲在模組腳本中,使維護和組織代碼變得更容易,因為只需要對一個模組腳指令碼進行更改,而不是更新多個腳本。
模組腳本基礎
模組腳本是與 紫色 對象相比的獨立對象。在 Roblox 中,模組腳本可以使用 紫色 圖示來表示。
創建模組指令碼
ModuleScripts 通常會放置在 ServerScriptService 中,當服務器側腳本使用它們時,或 ReplicatedStorage 當客戶側本腳本使用它們時 (例如 GUI 交互)。
- 在 ServerStorage 中建立 ModuleScript。
模組腳本結構
當創建時,每個模組腳本的開始時都會包含以下代碼:
local Module = {}return Module
您在 local Module = {} 行中建立了一個表,或容器的代碼,在此中可以存放模組的共用功能和變量。這個表應該被重命名為模組的目的,例如 RewardManager 或 ParticleController。與其他變量不同,
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 ,只能在該模組腳本中使用,並且包含外部模塊腳本的函數 1> GCoinReward()1> 。
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() 接受一個參引數,它是 Explorer 中模組腳本的位置。
要使用模指令碼,在另一個 script 中,設定一個變量等於 require(moduleScript) 。
local MyModule = require(ServerStorage.ModuleScript)
現在,變量 MyModule 包含在該模組腳指令碼中創建的模組表。要使用從該表中的功能和變量,請輸入變量名,並且在點後輸入正確的名稱,並將模組指令碼中的 MyModule.myFunction() 變更為 MyModule.myName 。當該腳本執行時,會存取模組表中的特定功能或
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
指令碼 - TreasureChestScript
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 中是一種方法程式員使用來組織和重用代碼的方法。模組脚本通常存放在 ServerStorage (或 ReplicatedStorage 為客戶端基礎互動) 中。從那裡,其他程式員可以呼叫存放在模組脚指令碼中的變數和函數。
舉例來說,有些遊戲會給玩家積分點數,以收集物件。 模組腳本可以處理代碼來給積分。 然後,對不同類型的物件的腳本可以直接呼叫模組腳本功能。 這樣可以降低代碼之間的重用需求,讓代碼更容易理解和維護。