ゲーム内 Tools は、プレイヤーがセッションで装備できる対話型のツールであり、武器、魔法の杖、懐中電灯、鍵などが含まれます。ツールをデザインし、プレイヤーのインベントリに追加するか、世界の中に拾得物として配置することができます。
ゲーム内ツールを作成する
Tool オブジェクトは、Roblox におけるすべてのツールの基礎なので、必要に応じて作成する必要があります。ツールの見た目をプレビューするには、Workspace でデザインするのが簡単で、その後、インベントリ アイテムや 獲得/購入 アイテムにすることができます。
物理的ツール
物理的ツールの Tool インスタンスを作成した後、3D世界での見た目を構成するために パーツ/メッシュを追加する 必要があります。プレイヤーキャラクターが グリップ するための ハンドル も含める必要があります。
パーツ/メッシュを追加する
ゲーム内ツールは、1つ以上の Parts および/または MeshParts で構成できます。ツールを複数の部品で構成する場合は、すべてを WeldConstraints や他の 機械的制約 を使用して接続し、プレイヤーが持ち運ぶ際にツールが一つのユニットとして保持されるようにしてください。

ハンドルを設定する
プレイヤーがツールを持ち運ぶためには、ツールの一部を Handle と名付ける必要があります。これはツールがキャラクターモデルの RightHand パーツ (R15) または Right Arm パーツ (R6) に接続する場所です。
ツールが単一の MeshPart で構成されている場合は、そのパーツに Handle と名前を付けるだけで済みます。そうでない場合は、親の Tool の 直接の子 として Handle という名の別のパーツを含め、その後 WeldConstraint または 機械的制約 を使用して別のパーツに取り付けることができます。
以下の例は、3つのインスタンスを持つツールを示しています: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 内に置きます。そこから、適切なタイミングでプレイヤーの Backpack にツールを Clone() することができます。

プレイヤーのインベントリにツールをクローン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())。 | プレイヤーが触れたまたはクリックした3D世界の位置に新しいパーツを作成します。 |
| 透明マント | プレイヤーがツールを装備した時 (Equipped()) または非装備にした時 (Unequipped()) を検出します。 | マントが装備されている間、プレイヤーを他のすべてのプレイヤーから見えないようにし、マントが外されたときにプレイヤーを完全に表示します。 |
| メガボウ | プレイヤーがツールをアクティブ化する時間を検出します (Activated() と Deactivated() の間の時間)。 | 検出されたアクティブ化時間に応じて、より強力または弱い魔法の矢を発射します。 |

