使用模块脚本创建

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

要应用您对模块脚本的知识,请创建一个模块脚本,允许玩家拿起钥匙并使用它们来打开宝箱。

项目设置

此项目包括带有排行榜和脚本提示对象的初始地图,用于钥匙和宝箱。

加载启动项目

  1. 下载启动项目。

  2. 在 Roblox Studio 中,打开下载的文件:介绍模块脚本 - 新手项目.rbxl .

创建模块脚本

玩家可以从箱子中获得宝藏,创建名为 TreasureManager 的模块脚本。使用模块脚本将使捡起和排行榜连接在一起。

  1. 在 ServerStorage 中,创建一个新的 ModuleScript 并将其重命名为 宝藏管理器。

  2. 宝藏管理器 中,将 module 的默认模块表重命名为 TreasureManager 在两个地方。


    local TreasureManager = {}
    return TreasureManager

使用模块脚本中的函数

要测试模块脚本中函数的工作方式,请创建一个名为 getKey() 的新函数。当从另一个脚本调用 getKey() 函数时,它将收到一个键部分来销毁并添加 1 到玩家的物品栏中的钥匙数。

创建一个模块函数以获取钥匙

  1. 此模块脚本将使用模块和本地函数的组合来帮助您将它们分开。


    local TreasureManager = {}
    ------------------ 本地函数
    ------------------ 模块功能
    return TreasureManager
  2. 模块功能 评论中,为 TreasureManager 添加一个名为 getKey() 的新模块功能。

    使用两个参数:

    • keyPart - 零件要摧毁。
    • whichCharacter - 触摸到钥匙部分的玩家。

    local TreasureManager = {}
    ------------------ 本地函数
    ------------------ 模块功能
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. getKey() 中,摧毁 keyPart


    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end

使用模块功能

现在,模块功能 getKey() 可以在其他脚本中使用。要测试该功能,您将打开一个预制脚本并调用它。

  1. 工作区 > 钥匙 > 钥匙脚本 打开钥匙脚本。

  2. 在 keyScript 中,将模块脚本存储在变量 treasureManager 中,并将其设置为: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- 需要下面的模块脚本⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. 已经有一个名为 partTouched() 的函数来检查玩家是否触摸到零件。在 partTouched() 内:

    • 调用 getKey() 模块函数来摧毁钥键。
    • 通过 keyPartwhichCharacter

    local ServerStorage = game:GetService("ServerStorage")
    -- 需要下面的模块脚本⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
    local function partTouched(otherPart, keyPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- 给玩家一个钥匙,摧毁钥匙部分
    -- =====================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =====================================
    end
    end
  4. 运行项目并检查触摸钥匙会使其破坏。

排查提示

问题: 获取包含: "Infinite yield possible" 的错误消息。

  • 检查您的模块脚本在脚本中的拼写。如果模块脚本,例如 TreasureManager ,在不同的拼写,会有一个错误。 问题: 获取包含: "attempt to index global" 的错误消息。

  • 检查包含在 keyScript 中的模块脚本要求的行。如果模块未包含1) 必填 2)需要,它将无法使用该模块脚本的函数和变量。 问题: 脚本不会运行或无法拾取钥匙。

  • 在模块脚本中,请确保所有代码都在 local TreasureManager = {}return TreasureManager 之间。返回必须是模块脚本中的最后一行代码。

  • 检查行尾中是否有两个括号,例如在 WaitForChild("TreasureManager"))

创建一个本地函数

现在,排行榜可以跟踪玩家的钥匙和宝藏。要更改排行榜数量,请使用模块脚本中的本地函数。 使用本地函数更改玩家的钥匙或宝藏值只会在宝藏管理器脚本中(不是任何其他地方)需要。

  1. 在 ServerStorage 中,打开 宝藏管理器 脚本。

  2. 创建本地变量来执行以关注中/正在关注操作:

    • 获取玩家服务,以便脚本可以与玩家的排行榜统计数据工作。

    • 在触摸 keyPart 后,保存玩家获得的钥匙数。


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ 本地函数
    ------------------ 模块功能
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. 复制并粘贴这两个本地函数到 本地函数 部分。

    • getPlayerKeys() 返回玩家的 Lockpicks 排行榜值。

    • getPlayerTreasure() 返回玩家的 Treasure 排行榜统计值。


    ------------------ 本地函数
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
    local function getPlayerTreasure(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Treasure")
    end
    ------------------ Module Functions
  4. 要将其添加到玩家的钥匙,在 getKey() 模块功能:

    • 创建一个 local 变量来调用 getPlayerKeys(whichCharacter)

    • keyDrop 的值添加到 playerKeys


    ------------------ 模块功能
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. 运行项目。检查触摸钥匙会使其破坏并添加 1 到玩家的钥匙在排行榜上。

如果需要,请检查您的脚本与下面的任何问题。

Current TreasureManager Script

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ 本地函数
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ 模块功能
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager

从模块脚本中获取信息

玩家触摸宝箱时,如果他们至少有一个钥匙,那么 TreasureManager 模块脚本将会使用,检查他们是否拥有打开它并给予金币的钥匙。

检查箱子是否可以打开

  1. 首先,在 服务器存储 > 宝藏管理器 脚本中,设置变量,以便计算打开宝箱所需的钥匙数量和每个宝箱所包含的金币数量。


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    ------------------ 本地函数
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. 要创建一个检查玩家是否可以打开宝箱的函数,在 模块函数 部分,添加一个新函数到 TreasureManager 表名为 canOpenChest() ,并使用参数 2> whichCharacter2> 。


    ------------------ 模块功能
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. 复制并粘贴以下代码到 canOpenChest() 以返回 true 如果玩家有足够的钥匙,和 false 如果他们没有。


    function TreasureManager.canOpenChest(whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    if playerKeys.Value >= chestPickCost then
    return true
    else
    return false
    end
    end

给玩家发宝藏

玩家可以打开一个宝箱,在 宝藏管理器 中创建一个奖励他们宝藏的函数。

  1. TreasureManager 命名为 openChest() 添加一个新模块功能。

    通过两个参数传递:

    • chestPart - 是要摧毁的胸部。
    • whichCharacter - 玩家,向他们提供宝藏。

    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. 要从玩家那里拿走钥匙并奖励他们宝藏,请在 openChest() 中复制并粘贴以下代码。 此代码使用以前创建的变量,例如 chestReward ,每个箱子的宝藏数量。


    function TreasureManager.openChest(chestPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    local playerTreasure = getPlayerTreasure(whichCharacter)
    playerKeys.Value = playerKeys.Value - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart:Destroy()
    end

调用箱子函数

现在两个模块功能, canOpenChest()openChest() 已经创建,他们都可以使用预制 partTouched() 函数来调用 Chest 部分,每当玩家使用预制 1> partTouched1> 函数触摸它们时。

  1. 工作区 > 箱子 打开 ChestScript

  2. 创建一个名为 treasureManager 的新变量,并在 ServerStorage 中需要 TreasureManager 模块脚本。


    local ServerStorage = game:GetService("ServerStorage")
    -- 需要以下模块脚本
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. partTouched() ,在 if humanoid 声明下,创建一个名为 canOpen 的新变量,并将其设置为:

    treasureManager.canOpenChest(whichCharacter)


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- 检查玩家是否可以打开宝箱,然后让他们获得宝藏
    -- =====================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =====================================
    end
    end
  4. 然后,创建一个 if 声明来检查 canOpen 是否真实。

    • 如果是这样,请调用宝藏管理器的 openChest() 函数。

    • 然后,通过两个参数: chestPart,用于摧毁箱子,和 whichCharacter,用于奖励宝藏。


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- 检查玩家是否可以打开宝箱,然后让他们获得宝藏
    -- =====================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =====================================
    end
    end
  5. 运行项目。检查该:

    • 如果您至少有 1 把键,触摸一个箱子会将其摧毁并奖励宝藏。
    • 如果你没有 0 把钥匙,你无法打开宝箱。

排查提示

  • ChestScript 中,确保模块脚本中的函数名称与 canOpenChest() 的脚本名称相同。任何不同都会导致错误。

  • 检查复制并粘贴的函数,例如 treasureManager.openChest() ,是否与课程中显示的正确。任何差异都可能会导致脚本中的隐藏错误。

已完成脚本

已完成宝藏管理器脚本

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ 本地函数
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ 模块功能
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
完成的宝箱脚本

local ServerStorage = game:GetService("ServerStorage")
-- 需要下面的模块脚本⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 检查玩家是否可以打开宝箱,然后让他们获得宝藏
-- =====================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =====================================
end
end
-- 将每个胸部分绑定到触摸功能,以便在所有部分上都能使用
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
已完成的钥匙脚本

local ServerStorage = game:GetService("ServerStorage")
-- 需要下面的模块脚本⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 给玩家一个钥匙,摧毁钥匙部分
-- =====================================
treasureManager.getKey(keyPart, whichCharacter)
-- =====================================
end
end
-- 将每个键部分绑定到触摸功能,以便在所有部分上都能使用
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

概要

使用模块脚本在 Roblox 游戏中的常见应用是处理玩家使用的常见任务,例如授予他们积分。 对于此示例,一个名为 TreasureManager 的模块脚本被创建用于处理与游戏对象交互时玩家使用的任何钥匙和宝藏。