模組腳本介紹

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

隨著項目複雜化,就變得重要思考如何組織腳本。良好的組織習慣可以確保代碼在不同的腳本之間不會重複,或者變得很難管理。

組織和重複代碼的更好方法是使用 模組腳本 ,這是一種獨特類型的腳本,儲存一組用於滿足共同目的的功能和變量,例如管理玩家的金錢或敵人。模組腳本內的代碼可以被其他腳本使用。這樣,您可以在玩家完成任務或找到撿起時,呼叫與多個不同腳本提供的相同功能來獲得硬幣。

將常用的代碼存儲在模組腳本中,可以使維護和組織代碼變得更容易,因為只需要對一個模組指令碼進行更改,而不需要更新多個腳本。

模組腳本基礎

模組腳本實際上是與腳本對象分開的自己的對象。在 Roblox 中,模組腳本可以使用紫色 圖示來標示。

創建模組腳指令碼

模組指令碼通常會在 伺服器指令碼服務 中放置,當使用服務器側指令碼時,或在 重複儲存庫 中放置,當使用客戶端本地指令碼 (例如 GUI 互動) 時。

  1. 伺服器腳本服務 中創建一個 ModuleScript

模組腳本結構

當創建時,每個模組腳本開始使用以下代碼:


local Module = {}
return Module

local Module = {} 創建一個表或代碼容器,可以儲存模組的共用功能和變量。此表應該重新命名為模組的目的,例如 RewardManagerParticleController 。與其他 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) 中。從那裡,其他腳本可以呼叫儲存在該模組指令碼中的函數和變量。

例個體、實例,一個遊戲可以獎勵玩家收集物品的點數。模組腳本可以處理代碼來提供點數。然後,不同類型的對象的腳本只需呼叫模組腳本功能。這減少了在腳本之間重複使用代碼的需要,使代碼更容易理解和維護。