游戏内工具

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

游戏内的 Tools 是互动工具,玩家可以在游戏中装备它们,例如武器、魔法 Wand、手电筒、钥匙等。您可以设计工具并将其包含在玩家的库存中,或将其放置在世界各地作为可拾取物品。

创建游戏内工具

Tool 对象是 Roblox 中任何工具的基础,因此您需要创建一个。通过在 Workspace 中设计工具,您可以更容易地预览工具的外观,随后您可以将其制作成 库存 项目或 Earned/Purchased 项目。

  1. Explorer 层级中,悬停在 Workspace 上,点击 按钮并插入一个 Tool

    在工作区创建的工具对象
  2. 选择新创建的 Tool,访问 Properties 窗口,并自定义工具在玩家库存中的外观:

    • TextureId — 指定工具在玩家库存中的图像资产 ID。
    • ToolTip — 工具在玩家库存中的悬停提示名称。
  3. 决定工具是作为 物理工具在 3D 环境中(最常见)还是作为 非物理 工具存在,该工具仅占用玩家的库存,并响应他们的输入。

物理工具

为物理工具创建 Tool 实例后,您需要 添加 parts/meshes,以构造其在 3D 世界中的外观。您还需要包括一个 句柄,玩家角色将 握住

添加 parts/meshes

游戏内工具可以由一个或多个 Parts 和/或 MeshParts 组成。如果您将工具构造为多个部分,请记得使用 WeldConstraints 或其他 机械约束 将它们连接在一起,以确保工具在玩家移动时保持完整。

在 Studio 工具栏中指示的约束选择器

设置句柄

为了使玩家能够携带工具,工具的一部分需要命名为 Handle。这是工具将附着到角色模型的 RightHand(R15)或 Right Arm 部件的位置。

如果工具仅由一个 MeshPart 组成,则只需将该部分命名为 Handle。否则,您可以包括命名为 Handle 的单独部分,作为其父级 Tool直接子级,然后使用 WeldConstraint机械约束 将其附加到其他部分。

以下示例显示了一个由三部分组成的工具:Handle 网格、一个 RopeConstraint 和一个悬挂在绳子上的灯笼网格。

调整握持位置/方向

工具的 Grip 属性是一个 CFrame,指定工具相对于握住它的角色的位置和方向。

由于每个工具的理想握持位置/方向不同,您需要尝试不同的值,直到您工具的握持看起来正确。以下示例显示了悬挂灯笼的可能不正确和正确的 Grip 设置:

灯笼拖着地面,Grip.Position(0, -2, 0)Grip.Orientation(-90, 0, 0)
灯笼位于角色前面,Grip.Position(0, -1.5, 0)Grip.Orientation(25, 0, 0)

非物理工具

一个非物理的 Tool 仅占用玩家的 库存 并响应他们的输入。例如,一个角色扮演游戏可能会有一系列的魔法法术,玩家可以通过他们的库存 “施放”。

非物理工具不需要任何 3D 组合,并且不使用 Handle 部件,因此您应该 禁用 工具的 RequiresHandle 属性:

将工具添加到游戏中

完成 创建 游戏内工具后,您需要将其放置在 Explorer 层级的正确位置。您在层级中放置工具的位置取决于其预定用途。

玩家库存

如果您希望所有玩家在库存中开始时都有一个工具,请将其放在 StarterPack 容器中。当任何玩家生成时,该系统会将工具复制到他们的 Backpack 中。从那里,玩家可以通过点击其库存图标或按下相关的热键(例如 12)来装备工具。

请注意,工具会按照添加到 StarterPack 的顺序复制到玩家的库存(Backpack)中。为了更好地控制顺序,您可以向 StarterPack 添加一个 LocalScript,该脚本将在指定的 order 表中暂时将工具移动到 ReplicatedStorage,然后按照指定的顺序将它们重新-parent到 Backpack

重新排序库存

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local order = {"WaterSpell", "FireSpell", "AirSpell", "EarthSpell"}
local backpack = script.Parent
for _, item in backpack:GetChildren() do
if item:IsA("Tool") then
item.Parent = ReplicatedStorage
end
end
-- 以指定顺序将工具重新-parent到背包
for i = 1, #order do
local tool = ReplicatedStorage:FindFirstChild(order[i])
if tool then
tool.Parent = backpack
end
end

可收集工具

如果您希望允许玩家在探索 3D 世界时收集物理工具,请将这些工具放置在 Workspace 中,就像普通 3D 对象一样。收集到的工具将被自动装备并添加到玩家的库存中(您无需为角色抓取工具添加额外的碰撞检测)。

添加 parts/meshes 部分所述,工具部件通常不应被标记为 Anchored,因为当玩家字符捡起或装备一个锚定的工具时,它们将卡住。不过,如果您希望将可收集的工具锚定到 3D 世界中的特定位置,例如浮在离地面稍高的地方,您可以为工具添加以下 Script,在收集时解除其部件的锚定。

在装备/收集时解除工具的锚定

local tool = script.Parent
tool.Equipped:Connect(function()
for _, part in tool:GetDescendants() do
if part:IsA("BasePart") and part.Anchored then
part.Anchored = false
end
end
end)

Earned/Purchased 工具

如果您想将工具设定为玩家完成任务时的奖励,或在游戏内商店中出售工具,请将这些工具放入 ReplicatedStorage 中。从那里,您可以在适当的时间将 Clone() 工具克隆到玩家的 Backpack 中。

克隆工具到玩家的库存

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local player = Players.LocalPlayer
local backpack = player:WaitForChild("Backpack")
-- 创建工具的克隆
local tool = ReplicatedStorage:FindFirstChild("WaterSpell")
if tool then
local clone = tool:Clone()
clone.Parent = backpack -- 将克隆添加到玩家的背包
end

实现工具效果

将工具添加到游戏中 后,您可以实现脚本,使玩家能够使用他们的工具并执行所需的操作。以下工具特定事件指示工具的状态及玩家与之的输入。

  • Equipped() — 当玩家从他们的背包中选择工具时触发。
  • Unequipped() — 当玩家切换工具或丢弃工具时触发。
  • Activated() — 当玩家开始激活工具(点击、轻触或按下游戏手柄的后右触发器)时触发。
  • Deactivated() — 当玩家停止激活输入(释放按钮或触摸)时触发。
工具事件模板

local tool = script.Parent
local function onEquip()
print(tool.Name, "工具已装备")
end
local function onUnequip()
print(tool.Name, "工具已卸下")
end
local function onActivate()
print(tool.Name, "工具已激活")
end
local function onDeactivate()
print(tool.Name, "工具已停用")
end
tool.Equipped:Connect(onEquip)
tool.Unequipped:Connect(onUnequip)
tool.Activated:Connect(onActivate)
tool.Deactivated:Connect(onDeactivate)

工具事件仅在客户端的 LocalScripts 中触发,因为只有玩家的设备知道何时发生 输入。因此,大多数工具需要同时具有 LocalScript 和服务器端的 Script,每个脚本处理工具行为的某些方面,并且 RemoteEvent 在客户端与服务器之间传递信息(有关更多信息,请参见 远程事件和回调)。

以下是示例工具和由 LocalScriptScript 管理的其行为:

工具LocalScriptScript
创造者的 Wand检测玩家激活工具的位置(Activated())。在玩家触碰或点击 3D 世界中的位置创建一个新部件。
隐形斗篷检测玩家何时装备工具(Equipped())或卸下工具(Unequipped())。让玩家在装备斗篷时对所有其他玩家隐形,并在卸下斗篷时恢复玩家的完全可见性。
巨大弓检测玩家激活工具的时间(Activated()Deactivated() 之间的时间)。射出一支魔法箭,力度取决于检测到的激活时间。
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。