介绍模块脚本

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

随着项目复杂度的增加,它成为重要的考虑如何脚本组织。良好的组织实践可以确保代码在脚本之间不重复,或者变得很难管理。

组织和重用代码的更好方法是使用 模块脚本 ,这是一种独特的脚本类型,可以存储一组用于满足共同目的的功能和变量。例如,管理玩家资金或敌人。模块脚本中的代码可以被其他脚本使用。这种方式可以让您每次调用不同脚本中的相同功能。

通过将常用代码存储在模块脚本中,使更改只需要对一个模块脚本进行,而不是更新多个脚本。

模块脚本基础

模块脚本实际上是脚本对象的独立对象。在 Roblox 中,模块脚本可以使用 紫色 标志来表示。

创建模块脚本

ModuleScripts 通常放置在 ServerScriptService 中,当服务器端脚本使用时,或 ReplicatedStorage 当客户端本地脚本使用时(例如 GUI 交互)。

  1. 在 ServerStorage 中创建一个 ModuleScript。

模块脚本结构

当创建时,每个模块脚本的开始都包含以下代码:


local Module = {}
return Module

该行 local Module = {} 创建一个表,或容器的代验证码,在该模块的共享函数和变量可以存储。 此表应该被命名为模块的目的,例如 RewardManagerParticleController。 与其他变量, которые是 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 客户端基于交互的存储空间) 中。从那里,其他脚本可以调用存储在模块脚本中的函数和变量。

例实例,一些游戏可以奖励玩家收集对象。一个模块脚本可以处理代码来给玩家奖励。然后,对于不同类型的对象的脚本可以直接调用模块脚本函数。这使得代码在脚本之间的重用更容易,使代码更容易理解和维护。