ゲーム内の Tools は、プレイヤーがセッション中に装備できるインタラクティブなツールで、武器、魔法の杖、懐中電灯、鍵などがあります。ツールをデザインし、プレイヤーのインベントリに含めたり、世界中にピックアップとして配置したりできます。
ゲーム内ツールを作成する
Tool オブジェクトは、Roblox のツールの基礎となるため、これを作成する必要があります。ツールの見た目をプレビューするには、Workspace でデザインするのが簡単で、後で インベントリ アイテムや 獲得/購入 アイテムにすることができます。
新しい Tool を選択した状態で、Properties ウィンドウにアクセスし、ツールがプレイヤーのインベントリにどのように表示されるかをカスタマイズします:

物理ツール
物理ツールのために Tool インスタンスを作成した後、3D 世界での外観を構成するために パーツ/メッシュを追加 する必要があります。また、プレイヤーキャラクターが グリップ するための ハンドル を含める必要があります。
パーツ/メッシュを追加
ゲーム内ツールは、1つ以上の Parts および/または MeshParts で構成できます。ツールを複数の部品で構成する場合は、すべてを WeldConstraints または他の 機械的制約 を使用して接続し、プレイヤーが持ち運ぶ際にツールがユニットとして一体化されるようにしてください。

ハンドルを設定
プレイヤーがツールを持ち運べるようにするには、ツールの一部を Handle と名付ける必要があります。これは、ツールがキャラクターモデルの RightHand ボディパーツ (R15) または Right Arm パーツ (R6) に接続される場所です。
ツールが単一の MeshPart で構成されている場合は、そのパーツを単に Handle と名付けます。そうでない場合は、親 Tool の 直接の子 として Handle という別のパーツを含め、WeldConstraint または 機械的制約 で他のパーツに接続します。
以下の例は、Handle メッシュ、RopeConstraint、およびロープからぶら下がるランタンメッシュを持つツールを示しています。

グリップの位置/向きを調整
ツールの Grip プロパティは、ツールが持たれているキャラクターに対してどのように位置付けられ、向けられるかを指定する CFrame です。

理想的なグリップの位置/向きはツールごとに異なるため、ツールのグリップが正しく見えるまで値を試行錯誤する必要があります。以下の例は、ぶら下がるランタンの不正確な設定と正しい設定の可能性を示しています:


非物理ツール
非物理的な 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.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 内に配置します。そこから、適切なタイミングでプレイヤーの Backpack にツールを Clone() できます。

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 がクライアントからサーバーに情報を渡します (詳細については リモートイベントとコールバック を参照してください)。
以下は、LocalScript または Script によって管理されるツールとその動作の例です:
| ツール | LocalScript | Script |
|---|---|---|
| クリエイターの杖 | プレイヤーがツールをアクティブ化した場所を検出します (Activated())。 | プレイヤーが触れたりクリックした3D世界内の位置に新しいパーツを作成します。 |
| 透明マント | プレイヤーがツールを装備したとき (Equipped()) またはツールを外したとき (Unequipped()) を検出します。 | マントが装備されている間、プレイヤーを他のすべてのプレイヤーから見えなくし、マントが外されるとプレイヤーを完全に可視化します。 |
| メガボウ | プレイヤーがツールをアクティブ化している時間を検出します (Activated() と Deactivated() の間の時間)。 | 検出されたアクティブ化時間に応じて、より強力または弱い魔法の矢を発射します。 |
