随着项目变得复杂,了解如何组织脚本变得非常重要。良好的组织实践可以确保代码在脚本之间不重复或很难管理。
更好地组织和重复代码的方法是使用 模块脚本 ,这是一个独特的类型的脚本,存储一组用于满足共同目的的函数和变量,例如管理玩家的金钱或敌人。模块脚本中的代码可以被其他脚本使用。这样,您可以在玩家完成任务或找到拾取物时,调用相同的函数,从多个不同脚本获取硬币。
通过在模块脚本中存储常用代码,使维护和组织代码更容易,因为更改只需要对一个模块脚本进行,而不需要更新多个脚本。
模块脚本基础
模块脚本实际上是与脚本对象分开的自己的对象。在 Roblox 中,模块脚本可以用紫色 标志表示 。
创建模块脚本
模块脚本通常在服务器端脚本和客户端本地脚本(例如 GUI 互动)使用时放置在 ServerScriptService 中,在客户端端本地脚本(例如 GUI 互动)使用时放置在 ReplicatedStorage 中。
- 在 ServerScriptService 中创建一个 ModuleScript 。

模块脚本的结构
创建时,每个模块脚本都以下代码开始:
local Module = {}return Module
行 local Module = {} 创建一个表或容器的代验证码,其中可以存储模块的共享函数和变量。该表应更改为模块的目的,例如 RewardManager 或 ParticleController 。与其他变量相比,模块表推荐使用帕斯卡案并开始大写( )。
local RewardManager = {}return RewardManager
因此,其他脚本可以使用模块的非本地函数或变量,每个模块以返回 MyModule 结束。每当另一个脚本尝试从模块获取代码时,返回允许该脚本存储在模块表中的访问代码。
添加到模块脚本
要将函数或变量添加到模块,以便在另一个脚本中使用,请输入模块表的名称,然后加上一个点,并函数或变量的名称,如在 TestModule.myVariable 中。使用 dot 运营符是另一种将代码添加到表的方法,允许其他脚本随时访问模块表返回时的代码。
local TestModule = {}
-- 向“TestModule”表添加变量
TestModule.myVariable = 100
-- 向“TestModule”表添加一个函数
function TestModule.doTask(player)
-- 占位符代验证码
end
return TestModule
在模块脚本中的范围
为了在外部脚本中使用模块函数或变量, 不 输入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 包含在那个模块脚本中创建的模块表。要使用该表中的函数和变量,请输入变量名称, followed by a dot, 并准确地输入该模块脚本中使用的内容,例如 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) 中。从那里,其他脚本可以调用该模块脚本中存储的函数和变量。
例实例,一个游戏可以向玩家授予积分,因为他们收集了物品。模块脚本可以处理代码以获得积分。然后,不同类型的对象的脚本只需调用模块脚本函数。这减少了在脚本之间重复使用代码的需要,使代码更容易理解和维护。