遊戲內的 Tools 是玩家可以在遊戲中裝備的互動工具,例如武器、魔法杖、手電筒、鑰匙等。你可以設計工具並將其包含在玩家的背包中,或者將其放置在世界各地作為撿拾物。
創建一個遊戲內工具
Tool 物件是 Roblox 任何工具的基礎,因此你需要創建一個。在 Workspace 中設計工具會更方便預覽其外觀,稍後你可以將其設為 背包 項目或 獲得/購買 項目。
決定這個工具是要作為 3D環境中的實體工具(最常見)還是 非實體 工具,後者僅占用玩家的背包並對他們的輸入作出反應。
實體工具
創建了物理工具的 Tool 實例後,你需要 添加部件/網格 來構成它在 3D 世界中的外觀。你還需要包含一個 手柄,玩家角色可以 握住 的部分。
添加部件/網格
遊戲內工具可以由一個或多個 Parts 和/或 MeshParts 組成。如果你將工具由多個部分組成,記得使用 WeldConstraints 或其他 機械約束 將它們連接在一起,這樣工具在玩家攜帶時才能保持一致。

設定手柄
要允許玩家攜帶工具,工具的一部分需要命名為 Handle。這部分將連接到角色模型的 RightHand 部分(R15)或 Right Arm 部分(R6)。
如果工具由一個 MeshPart 組成,只需將該部分命名為 Handle。否則,你可以包含一個單獨的部分,並將其命名為 Handle 作為父級 Tool 的 直接子項,然後使用 WeldConstraint 或 機械約束 將其附加到另一個部分。
以下範例顯示了一個由三個實例組成的工具:Handle 網格、一個 RopeConstraint 和懸掛在繩子上的燈籠網格。

調整握住位置/方向
工具的 Grip 屬性是一個 CFrame,指定工具相對於握住它的角色的定位和方向。

由於每個工具的理想握持位置/方向都不同,你需要試驗這些值,直到工具的握持看起來正確。以下範例顯示了吊燈的可能不正確和正確的 Grip 設定:


非實體工具
非實體的 Tool 僅占用玩家的 背包,並對他們的輸入作出反應。例如,一個角色扮演遊戲可能會包含一系列魔法法術,玩家可以通過他們的背包 "施放"。

非實體工具不需要任何 3D 組成,也不使用 Handle 部件,因此你應該 禁用 工具的 RequiresHandle 屬性:

將工具添加到遊戲中
一旦你完成了 創建 遊戲內工具,你需要將其放置在 Explorer 階層的正確位置。你在階層中放置工具的位置取決於它的預期用途。
玩家背包
如果你希望所有玩家開局時就擁有一個工具,請將其放在 StarterPack 容器內。當任何玩家重生時,系統會將工具複製到他們的 Backpack。從那裡,玩家可以通過點擊其背包圖示或按下關聯熱鍵如 1 或 2 來裝備該工具。

請注意,工具會按添加到 StarterPack 的順序複製到玩家的背包 (Backpack)。若希望更有序的排序,可以在 StarterPack 添加一個 LocalScript,將工具暫時移動到 ReplicatedStorage,然後按照 order 表中的指定順序重新父級它們到 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-- 按指定順序將工具重新父級到背包for i = 1, #order dolocal tool = ReplicatedStorage:FindFirstChild(order[i])if tool thentool.Parent = backpackendend
可收集工具
如果你想允許玩家在探索 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.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 |
|---|---|---|
| 創造者之杖 | 檢測玩家激活工具的位置 (Activated())。 | 在玩家觸碰或點擊的位置創建新部件。 |
| 隱形斗篷 | 檢測玩家何時裝備工具 (Equipped()) 或卸裝工具 (Unequipped())。 | 在裝備斗篷期間讓玩家對其他所有玩家隱形,並在卸裝斗篷時恢復玩家的完整可見性。 |
| 巨弓 | 檢測玩家激活工具的時長(Activated() 和 Deactivated() 之間的時間)。 | 根據檢測到的激活時間射出威力更大或更小的魔法箭。 |

