随着项目复杂度的增加,它成为重要的考虑如何脚本组织。良好的组织实践可以确保代码在脚本之间不重复,或者变得很难管理。
组织和重用代码的更好方法是使用 模块脚本 ,这是一种独特的脚本类型,可以存储一组用于满足共同目的的功能和变量。例如,管理玩家资金或敌人。模块脚本中的代码可以被其他脚本使用。这种方式可以让您每次调用不同脚本中的相同功能。
通过将常用代码存储在模块脚本中,使更改只需要对一个模块脚本进行,而不是更新多个脚本。
模块脚本基础
模块脚本实际上是脚本对象的独立对象。在 Roblox 中,模块脚本可以使用 紫色 标志来表示。
创建模块脚本
ModuleScripts 通常放置在 ServerScriptService 中,当服务器端脚本使用时,或 ReplicatedStorage 当客户端本地脚本使用时(例如 GUI 交互)。
- 在 ServerStorage 中创建一个 ModuleScript。
模块脚本结构
当创建时,每个模块脚本的开始都包含以下代码:
local Module = {}return Module
该行 local Module = {} 创建一个表,或容器的代验证码,在该模块的共享函数和变量可以存储。 此表应该被命名为模块的目的,例如 RewardManager 或 ParticleController。 与其他变量, которые是 camel 例 (
local RewardManager = {}return RewardManager
因此,其他脚本可以使用模块的非本地函数或变量,每个模块以 MyModule 结束。当另一个脚本尝试从模块中获取代码时,返回让该脚本从模块表中访问存储在模块中的代码。
添加到模块脚本
要将功能或变量添加到另一个脚本中使用的模块,请使用“。”(TestModule.myVariable )的名称,然后在“.”后面添加功能或变量的名称,例如在 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 中的模块脚本。
要使用模块,在一个单独的脚本中,设置一个变量,等于 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
脚本 - TreasureChestScript
local ServerStorage = game:GetService("ServerStorage")-- 载入模块脚本local RewardManager = require(ServerStorage.RewardManager)--从模块脚本中调用函数local coins = RewardManager.getCoinReward("easy")print("Should award " .. coins .. " coins")
一般排障
有些提示在这里解决常见问题,例如使用模块脚本时。请注意模块脚本可能是一个复杂的主题,有更多 nuance。 要了解更多信息,请参阅模块脚本 上的这个更技术手册。 问题: 获取包含: "Infinite yield possible" 或 "not a valid member" 的错误消息。
检查模块脚本的拼写在它加载时。 require() 必须包含模块脚本的正确路径和拼写,这可能与模块表不同的命名。 问题: 获取包含: "attempt to index global" 的错误消息。
使用模块脚本的任何脚本,请确保它使用了 require() 的函数。 如果没有,那个脚本不能使用模块脚本的函数和变量。
概要
Roblox的模块脚本 在 Roblox 中是一个方法代码使用来组织和重用代验证码的。一个模块脚本通常存储在 ServerStorage (或 ReplicatedStorage 客户端基于交互的存储空间) 中。从那里,其他脚本可以调用存储在模块脚本中的函数和变量。
例实例,一些游戏可以奖励玩家收集对象。一个模块脚本可以处理代码来给玩家奖励。然后,对于不同类型的对象的脚本可以直接调用模块脚本函数。这使得代码在脚本之间的重用更容易,使代码更容易理解和维护。