ユーザーが3D空間のオブジェクトに近づくと表示され、ユーザー入力に基づいてアクションをトリガーするインタラクティブなプロキシミティプロンプトを作成できます。
このチュートリアルでは、Dungeon Delveプロジェクトをショーケースとして使用します。続行する前に、スタジオでプロジェクトを開いてください。

プロンプトを作成する
画面上のプロンプトは、ProximityPromptオブジェクトがAttachment、BasePart、またはModelに親として追加されることで生成されます。
3DビューまたはExplorer(Workspace → PromptObjects → PrisonDoor)からPrisonDoorモデルを選択します。


ツリーを展開し、Doorオブジェクトを選択します。

Attachmentにプロンプトを配置すると、パーツ/モデルの上に直接配置するよりもインタラクションポイントの位置をより細かく制御できます。新しいAttachmentを挿入し、名前をPromptAttachmentに変更します。

新しいアタッチメントのPositionプロパティを**-2.25**、-0.5、-0.5に設定します。これにより、ドアの鍵穴の前に移動します。


PromptAttachmentにカーソルを合わせ、新しいProximityPromptオブジェクトを挿入します。

プロンプトの外観
プロンプトは、主に3つの要素で構成されており、それぞれ次のプロパティによって制御できます。

- ObjectText — 対象のオブジェクトのオプションの名前。
- ActionText — ユーザーに表示されるオプションのアクション名。
- KeyboardKeyCode — プロンプトをトリガーするキーボードキー。
- GamepadKeyCode — プロンプトをトリガーするゲームパッドボタン。
刑務所のドアプロンプトの外観をカスタマイズするには、次の変更を行います。
Propertiesウィンドウで、ObjectTextプロパティを見つけてDoorと入力します。

ActionTextプロパティには、Pick Lockと入力します。

アクティベーション距離
プロンプトは、ユーザーのキャラクターがプロンプトオブジェクトの親のMaxActivationDistance範囲内に移動すると表示されます。

デフォルトの値はほとんどのケースで適切ですが、MaxActivationDistanceを4に変更することで、ユーザーインタラクションをロックに近づけることができます。

ホールド期間
HoldDurationプロパティの値は、プロンプトのアクションがトリガーされる速さを秒単位で決定します。このドアは解錠するために解除する必要があるため、HoldDurationプロパティを4に変更します。

アクションを実装する
プロンプトイベントを検出する最良の方法は、ProximityPromptServiceを使用することです。これにより、各プロンプトオブジェクトにスクリプトをアタッチせずにイベントを中央で検出できます。
基本的なフレームワークは次のようになります。
local ProximityPromptService = game:GetService("ProximityPromptService")
-- プロンプトがトリガーされたときに検出する
local function onPromptTriggered(promptObject, player)
end
-- プロンプトホールドが開始されたときに検出する
local function onPromptHoldBegan(promptObject, player)
end
-- プロンプトホールドが終了したときに検出する
local function onPromptHoldEnded(promptObject, player)
end
-- プロンプトイベントを処理関数に接続する
ProximityPromptService.PromptTriggered:Connect(onPromptTriggered)
ProximityPromptService.PromptButtonHoldBegan:Connect(onPromptHoldBegan)
ProximityPromptService.PromptButtonHoldEnded:Connect(onPromptHoldEnded)
| イベント | 説明 |
|---|---|
| PromptTriggered | ユーザーがプロンプトとインタラクトしたときに発火し、非ゼロのHoldDurationのプロンプトのための期間の後に発生します。 |
| PromptButtonHoldBegan | ユーザーが非ゼロのHoldDurationのプロンプトとインタラクトし始めたときに発火します。 |
| PromptButtonHoldEnded | ユーザーが非ゼロのHoldDurationのプロンプトとのインタラクションを停止したときに発火します。 |
Dungeon Delveプロジェクトでは、これらのイベントはServerScriptService内のPromptEventsスクリプトによって管理されています。

スクリプト内では、上記のイベントは単にObjectActions ModuleScript内の関数を呼び出します。このスクリプトもServerScriptServiceにあります。
local ProximityPromptService = game:GetService("ProximityPromptService")
local ServerScriptService = game:GetService("ServerScriptService")
local ObjectActions = require(ServerScriptService.ObjectActions)
-- プロンプトがトリガーされたときに検出する
local function onPromptTriggered(promptObject, player)
ObjectActions.promptTriggeredActions(promptObject, player)
end
-- プロンプトホールドが開始されたときに検出する
local function onPromptHoldBegan(promptObject, player)
ObjectActions.promptHoldBeganActions(promptObject, player)
end
-- プロンプトホールドが終了したときに検出する
local function onPromptHoldEnded(promptObject, player)
ObjectActions.promptHoldEndedActions(promptObject, player)
end
-- プロンプトイベントを処理関数に接続する
ProximityPromptService.PromptTriggered:Connect(onPromptTriggered)
ProximityPromptService.PromptButtonHoldBegan:Connect(onPromptHoldBegan)
ProximityPromptService.PromptButtonHoldEnded:Connect(onPromptHoldEnded)
プロキシミティプロンプトは、ゲーム内オブジェクトとのインタラクションのための便利でカスタマイズ可能なソリューションです。プロンプトの動作を制御するためのさらなる方法については、ProximityPromptやProximityPromptServiceのリファレンスページを確認し、Dungeon Delve内の他のインタラクティブなオブジェクトを探索して、創造的なインスピレーションを得てください。