游戏内的 Tools 是互动工具,玩家可以在游戏中装备它们,例如武器、魔法 Wand、手电筒、钥匙等。您可以设计工具并将其包含在玩家的库存中,或将其放置在世界各地作为可拾取物品。
创建游戏内工具
Tool 对象是 Roblox 中任何工具的基础,因此您需要创建一个。通过在 Workspace 中设计工具,您可以更容易地预览工具的外观,随后您可以将其制作成 库存 项目或 Earned/Purchased 项目。
选择新创建的 Tool,访问 Properties 窗口,并自定义工具在玩家库存中的外观:

决定工具是作为 物理工具在 3D 环境中(最常见)还是作为 非物理 工具存在,该工具仅占用玩家的库存,并响应他们的输入。
物理工具
为物理工具创建 Tool 实例后,您需要 添加 parts/meshes,以构造其在 3D 世界中的外观。您还需要包括一个 句柄,玩家角色将 握住。
添加 parts/meshes
游戏内工具可以由一个或多个 Parts 和/或 MeshParts 组成。如果您将工具构造为多个部分,请记得使用 WeldConstraints 或其他 机械约束 将它们连接在一起,以确保工具在玩家移动时保持完整。

设置句柄
为了使玩家能够携带工具,工具的一部分需要命名为 Handle。这是工具将附着到角色模型的 RightHand(R15)或 Right Arm 部件的位置。
如果工具仅由一个 MeshPart 组成,则只需将该部分命名为 Handle。否则,您可以包括命名为 Handle 的单独部分,作为其父级 Tool 的 直接子级,然后使用 WeldConstraint 或 机械约束 将其附加到其他部分。
以下示例显示了一个由三部分组成的工具:Handle 网格、一个 RopeConstraint 和一个悬挂在绳子上的灯笼网格。

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

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


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

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

将工具添加到游戏中
完成 创建 游戏内工具后,您需要将其放置在 Explorer 层级的正确位置。您在层级中放置工具的位置取决于其预定用途。
玩家库存
如果您希望所有玩家在库存中开始时都有一个工具,请将其放在 StarterPack 容器中。当任何玩家生成时,该系统会将工具复制到他们的 Backpack 中。从那里,玩家可以通过点击其库存图标或按下相关的热键(例如 1 或 2)来装备工具。

请注意,工具会按照添加到 StarterPack 的顺序复制到玩家的库存(Backpack)中。为了更好地控制顺序,您可以向 StarterPack 添加一个 LocalScript,该脚本将在指定的 order 表中暂时将工具移动到 ReplicatedStorage,然后按照指定的顺序将它们重新-parent到 Backpack。
重新排序库存local ReplicatedStorage = game:GetService("ReplicatedStorage")local order = {"WaterSpell", "FireSpell", "AirSpell", "EarthSpell"}local backpack = script.Parentfor _, item in backpack:GetChildren() doif item:IsA("Tool") thenitem.Parent = ReplicatedStorageendend-- 以指定顺序将工具重新-parent到背包for i = 1, #order dolocal tool = ReplicatedStorage:FindFirstChild(order[i])if tool thentool.Parent = backpackendend
可收集工具
如果您希望允许玩家在探索 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.LocalPlayerlocal backpack = player:WaitForChild("Backpack")-- 创建工具的克隆local tool = ReplicatedStorage:FindFirstChild("WaterSpell")if tool thenlocal 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 在客户端与服务器之间传递信息(有关更多信息,请参见 远程事件和回调)。
以下是示例工具和由 LocalScript 或 Script 管理的其行为:
| 工具 | LocalScript | Script |
|---|---|---|
| 创造者的 Wand | 检测玩家激活工具的位置(Activated())。 | 在玩家触碰或点击 3D 世界中的位置创建一个新部件。 |
| 隐形斗篷 | 检测玩家何时装备工具(Equipped())或卸下工具(Unequipped())。 | 让玩家在装备斗篷时对所有其他玩家隐形,并在卸下斗篷时恢复玩家的完全可见性。 |
| 巨大弓 | 检测玩家激活工具的时间(Activated() 和 Deactivated() 之间的时间)。 | 射出一支魔法箭,力度取决于检测到的激活时间。 |
