模組腳本簡介

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

隨著專案變得複雜,思考腳本的組織方式變得重要。良好的組織實踐可以確保代碼不會在腳本之間重複,或變得難以管理。

一種更好的組織和重用代碼的方法是使用 模組腳本,這是一種獨特的腳本類型,用於存儲一組旨在滿足共享目的的函數和變數,例如管理玩家的金錢或敵人。模組腳本中的代碼可以被其他腳本使用。這樣,當玩家完成任務或找到道具時,您可以從多個不同的腳本中調用相同的給予硬幣的函數。

通過將常用代碼存儲在模組腳本中,維護和組織代碼變得更容易,因為只需對一個模組腳本進行更改,而不必更新多個腳本。

模組腳本基礎

模組腳本實際上是與腳本對象不同的獨立對象。在 Roblox 中,模組腳本可以用 紫色 圖標表示。

創建模組腳本

當用於伺服器端腳本時,模組腳本通常放置在 ServerScriptService 中,而用於客戶端本地腳本(例如 GUI 交互)時則放置在 ReplicatedStorage 中。

  1. ServerScriptService 中創建一個 ModuleScript

模組腳本的結構

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

local Module = {}
return Module

這行 local Module = {} 創建了一個表,或代碼容器,用於存儲模組的共享函數和變數。這個表應該重命名為模組的目的,例如 RewardManagerParticleController。與其他變數(如 myVariable)不同,模組表建議使用 Pascal 大小寫並以大寫字母開頭(MyModule)。

local RewardManager = {}
return RewardManager

為了讓其他腳本可以使用模組的非本地函數或變數,每個模組都以 return MyModule 結尾。每當另一個腳本嘗試從模組獲取代碼時,return 允許該腳本訪問存儲在模組表中的代碼。

向模組腳本添加內容

要向模組中添加可以在其他腳本中使用的函數或變數,請輸入模組表的名稱,後跟一個點,然後是函數或變數的名稱,例如 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() 接受一個參數,即模組腳本在 Explorer 中的位置。

要使用模組,在單獨的腳本中,將變數設置為 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 - TreasureChestScript
local ServerStorage = game:GetService("ServerStorage")
-- 加載模組腳本
local RewardManager = require(ServerStorage.RewardManager)
-- 從模組腳本調用函數
local coins = RewardManager.getCoinReward("easy")
print("應該獎勵 " .. coins .. " 硬幣")

一般故障排除

這裡的一些提示針對使用模組腳本時的常見問題。請記住,模組腳本可能是一個複雜的主題,具有更多的細微差別。欲了解更多詳細信息,請參閱這本更技術性的指南 模組腳本

問題: 獲得錯誤消息,包括:"Infinite yield possible""not a valid member"

  • 檢查加載模組腳本的拼寫。require() 必須包含模組腳本的確切路徑和拼寫,這可能與模組表的名稱不同。

問題: 獲得錯誤消息,包括:"attempt to index global"

  • 在任何使用模組腳本的腳本中,確保使用函數 require() 加載它。如果沒有,該腳本將無法使用模組腳本中的函數和變數。

總結

模組腳本 在 Roblox 中是程序員用來組織和重用代碼的一種方法。模組腳本通常存儲在 ServerStorage 中(或用於基於客戶端的交互的 ReplicatedStorage 中)。從那裡,其他腳本能夠調用存儲在該模組腳本中的函數和變數。

例如,一個遊戲可能會因為收集物體而獎勵玩家點數。模組腳本可以處理給予點數的代碼。然後,不同類型物體的腳本可以直接調用模組腳本函數。這減少了在腳本之間重用代碼的需要,使代碼更易於理解和維護。

©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。