游戏内工具

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

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

创建游戏内工具

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

  1. 资源管理器 层级中,将鼠标悬停在 Workspace 上,点击 按钮,插入一个 Tool

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

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

物理工具

创建物理工具的 Tool 实例后,您需要 添加 部件/网格 来构成其在 3D 世界中的外观。您还需要包含一个 把手,玩家角色将 握住 它。

添加部件/网格

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

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

设置把手

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

如果工具由一个 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 属性:

将工具添加到游戏中

完成 创建 游戏内工具后,您需要将其放置在 资源管理器 层级的正确区域。您在层级中放置工具的位置取决于其预期用途。

玩家库存

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

请注意,工具会按照添加到 StarterPack 的顺序复制到玩家的库存 (Backpack) 中。为了更好地控制顺序,您可以向 StarterPack 添加一个 LocalScript,该脚本暂时将工具移动到 ReplicatedStorage,然后按 order 表中指定的顺序将它们重新父级到 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
-- 按指定顺序将工具重新父级到背包
for i = 1, #order do
local tool = ReplicatedStorage:FindFirstChild(order[i])
if tool then
tool.Parent = backpack
end
end

可收集工具

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

添加部件/网格 部分所述,工具部件通常不应为 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)

获得/购买工具

如果您希望将工具设置为玩家完成任务时的奖励,或在游戏内商店中出售工具,请将这些工具放入 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
创造者的魔杖检测玩家激活工具的位置 (Activated())。在玩家触摸或点击的 3D 世界位置创建一个新部件。
隐形斗篷检测玩家装备工具 (Equipped()) 或卸下工具 (Unequipped()) 的时间。在斗篷装备时使玩家对所有其他玩家隐形,并在斗篷卸下时恢复玩家的完全可见性。
超级弓检测玩家激活工具的时间(Activated()Deactivated() 之间的时间)。发射一支魔法箭,力量根据检测到的激活时间而有所不同。
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。