遊戲內工具

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

遊戲內的 Tools 是玩家可以在遊戲中裝備的互動工具,例如武器、魔法杖、手電筒、鑰匙等。您可以設計工具並將其包含在玩家的庫存中,或將其放置在世界各地作為拾取物。

創建遊戲內工具

Tool 物件是 Roblox 中任何工具的基礎,因此您需要創建一個。通過在 Workspace 中設計工具,可以更輕鬆地預覽工具的外觀,然後您可以將其製作成 庫存 物品或 獲得/購買 物品。

  1. Explorer 階層中,將滑鼠懸停在 Workspace 上,點擊 按鈕,然後插入一個 Tool

    在工作區創建的工具物件
  2. 選擇新的 Tool,訪問 Properties 窗口,並自定義工具在玩家庫存中的外觀:

    • 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 屬性:

將工具添加到遊戲中

完成 創建 遊戲內工具後,您需要將其放置在 Explorer 階層的正確區域。您在階層中放置工具的位置取決於其預期用途。

玩家庫存

如果您希望所有玩家在庫存中開始時都有一個工具,請將其放入 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 世界時收集物理工具,請將工具放置在 Workspace 中,就像普通的 3D 物件一樣。收集的工具將自動裝備並添加到玩家的庫存中(您不需要為角色抓取工具添加額外的碰撞檢測)。

添加部件/網格 部分所述,工具部件通常不應該是 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()) 或卸下工具 (`Class.Tool.Unequipped|Unequipped())。在斗篷裝備時使玩家對所有其他玩家隱形,並在卸下斗篷時恢復玩家的完全可見性。
超級弓檢測玩家激活工具的時間(Activated()Deactivated() 之間的時間)。根據檢測到的激活時間發射一支魔法箭,威力大小不一。
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。