模块脚本介绍

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

随着项目变得复杂,了解如何组织脚本变得非常重要。良好的组织实践可以确保代码在脚本之间不重复或很难管理。

更好地组织和重复代码的方法是使用 模块脚本 ,这是一个独特的类型的脚本,存储一组用于满足共同目的的函数和变量,例如管理玩家的金钱或敌人。模块脚本中的代码可以被其他脚本使用。这样,您可以在玩家完成任务或找到拾取物时,调用相同的函数,从多个不同脚本获取硬币。

通过在模块脚本中存储常用代码,使维护和组织代码更容易,因为更改只需要对一个模块脚本进行,而不需要更新多个脚本。

模块脚本基础

模块脚本实际上是与脚本对象分开的自己的对象。在 Roblox 中,模块脚本可以用紫色 标志表示

创建模块脚本

模块脚本通常在服务器端脚本和客户端本地脚本(例如 GUI 互动)使用时放置在 ServerScriptService 中,在客户端端本地脚本(例如 GUI 互动)使用时放置在 ReplicatedStorage 中。

  1. ServerScriptService 中创建一个 ModuleScript

模块脚本的结构

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


local Module = {}
return Module

local Module = {} 创建一个表或容器的代验证码,其中可以存储模块的共享函数和变量。该表应更改为模块的目的,例如 RewardManagerParticleController 。与其他变量相比,模块表推荐使用帕斯卡案并开始大写( )。


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) 中。从那里,其他脚本可以调用该模块脚本中存储的函数和变量。

例实例,一个游戏可以向玩家授予积分,因为他们收集了物品。模块脚本可以处理代码以获得积分。然后,不同类型的对象的脚本只需调用模块脚本函数。这减少了在脚本之间重复使用代码的需要,使代码更容易理解和维护。