创建硬币收集机制

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


现在您有了一个 3D 世界,该教程的这个部分教您如何添加您的第一个脚本来定义硬币收集机制。 此机制允许玩家收集硬币,并且禁用最近收集硬币的机制。

创建金币

在您可以脚本任何内容之前,您需要在世界中拥有占位符对象来使用作为您的硬币。 像海堆平台您在上一节中创建的那样,硬币可以是单一的 Part 对象。

要创建硬币:

  1. Explorer 窗口中,将一个新文件夹添加到 World 文件夹,然后将其重命名为 Coins

  2. 圆柱体 零件插入 金币 文件夹,然后将零件重命名为 金币

    Studio's Explorer window with the Coin part highlighted. The hierarchy of the Workspace to World folder to Coins folder to Coin part is also highlighted.
  3. 选择零件,然后在 属性 窗口中,

    • 砖块颜色 设置为 金色
    • 材料 设置为 金属 .
    • 将 大小 设置为 0.6, 8, 4。
    • 禁用 可以碰撞 。这告诉引擎其他部分可以通过硬币,因此玩家可以穿过硬币以收集它们。
    • 启用 锚定 。这使发动机永远不会因任何物理相关模拟而改变硬币的位置,从而保证玩家可以触摸硬币,而不会影响其位置。
    A close up view of a gold coin next to two gray cylinder sea stacks on the island.
  4. 复制几枚硬币,将它们放置在地图上进行测试。

    Studio's Explorer window with multiple Coin parts highlighted under the Coins folder. A view of multiple coins on the island and two gray cylinder sea stacks.

您的气缸部件现在看起来像硬币,防止物理模拟,但您需要为硬币添加逻辑,以便玩家可以收集它们。

创建脚本

要让硬币能够被收集,你想要对玩家触摸它们。 Roblox 引擎可以向你发送触摸硬币的玩家,但你需要在脚本中声明这一点。 要创建脚本:

  1. Explorer 窗口中,将鼠标悬停在 ServerScriptService 上,然后单击 按钮。一个上下文菜单显示。

  2. 从上下文菜单中,选择脚本。一个新的脚本会在服务器脚本服务下显示,它告诉引擎在服务器上运行脚本,并防止客户端访问代验证码。

    Studio's Explorer window with both ServerScriptService's plus icon and Script object highlighted.
  3. 将脚本重命名为 CoinService

    Studio's Explorer window with the CoinService script highlighted under ServerScriptService.
  4. 将以下代码替换为默认代验证码:


    -- 初始化服务和变量
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local coinsFolder = Workspace.World.Coins
    local coins = coinsFolder:GetChildren()
    local COOLDOWN = 10
    -- 定义事件处理器
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- 玩家触摸了一个硬币
    coin.Transparency = 1
    coin:SetAttribute("Enabled", false)
    print("Player collected coin")
    task.wait(COOLDOWN)
    coin.Transparency = 0
    coin:SetAttribute("Enabled", true)
    end
    end
    end
    -- 设置事件听取者
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    现在,每当玩家触摸到硬币,硬币会在 10 秒内消失,并且输出日志会打印 Player collected coin

    下面的部分描述了脚本在更多细节上如何工作。

    初始化服务和变量

    与许多您可能已经在其他语言中写代码的时候,您定义变量,您需要稍后在脚本顶部定义。我们的代码如关注中/正在关注:

    • 获得服务实例 - Roblox 服务为常见功能提供内置功能。脚本首先获得 Workspace,其中包含 3D 世界中的所有对象,并且 Player,管理和容纳您体验的所有玩家。

    • 获取所有金币的参考 - 脚本然后查询 3D 工作区中的所有金币对象使用 GetChildren() 方法。此方法返回一个包含您创建前先前创建的对象所有父级的列表,在此情况下是 Workspace.World.Coins 文件夹。

    • 定义一个全球变量 - 变量 COOLDOWN 用于稍后定义硬币收集后禁用的时间。

      初始化服务和变量

      local Workspace = game:GetService("Workspace")
      local Players = game:GetService("Players")
      local coinsFolder = Workspace.World.Coins
      local coins = coinsFolder:GetChildren()
      local COOLDOWN = 10
      ...

    定义事件处理器

    Roblox 引擎使用物理模拟 3D 世界,并且处理有关渲染、物理和网络的事件。 当您对脚本您自己的逻辑感兴趣时,您可以听到并处理这些事件,而让引擎为其余部分进行处理。 在这种情况下,您听到并处理有关触摸硬币的事件的脚本定

    • 检查是否启用硬币 - 每个 Instance 都有一个 Enabled 属性,该属性定义是否存在在 3D 世界中的对象。您可以通过使用 0> Class.Instance:GetAttribute()|GetAttribute()0> 方法获取实例属性。

    • 检测玩家是否触摸了金币 - 如果金币已启用,方法使用玩家服务检查是否触摸金币的对象是否是玩家。 当触摸事件发生时,Roblox 引擎将触摸金币的对象作为 otherPart 参数传递给父级。 脚本检查是否父级的 otherPart

    • 禁用玩家触摸它,并在 10 秒后重新启用它 - 最后,如果玩家触摸它,方法会禁用它,然后在 10 秒后重新启用它以进行收系列。 task.wait() 用于代码执行不完整的情况下提供更好的性能,因此在其他线

      定义事件处理器

      local function onCoinTouched(otherPart, coin)
      if coin:GetAttribute("Enabled") then
      local character = otherPart.Parent
      local player = Players:GetPlayerFromCharacter(character)
      if player then
      -- 玩家触摸了一个硬币
      coin.Transparency = 1
      coin:SetAttribute("Enabled", false)
      print("Player collected coin")
      task.wait(COOLDOWN)
      coin.Transparency = 0
      coin:SetAttribute("Enabled", true)
      end
      end
      end

    连接事件处理器

    所有模拟的 3D 对象都继承自 BasePart ,因此具有一个 Touched() 事件。以下循环连接 onTouchedEvent() 处理器到每个硬币的触摸事件,通过执行以关注中/正在关注操作:

    • 通过所有的硬币循环 - 使用通用循环通过每个硬币。

    • 将处理器连接到事件 - 在每次循环的开始时,默认情况下,金币已启用,因此它在 3D 世界中在初始启动时可以被看到。 onCoinTouched() 处理器方法还连接到金币的 Touched事

      连接事件处理器

      for _, coin in coins do
      coin:SetAttribute("Enabled", true)
      coin.Touched:Connect(function(otherPart)
      onCoinTouched(otherPart, coin)
      end)
      end

玩机械师

是时候看看金币收集机制是否如预期般运行。为了测试您的体验:

  1. 在菜单栏中,单击 播放 按钮。Studio进入播放测试模式。

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 移动您的角色触摸一个硬币。如果您的脚本正确运行,显示 输出 窗口显示 Player collected coin,硬币在 10 秒后重新出现。

    Studio's Output window that displays confirmation that the player collected a coin.