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

プロンプトを作成する
画面上のプロンプトは、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の他のインタラクティブオブジェクトを探索して創造的なインスピレーションを得てください。