柔軟で Blueprint に対応したインタラクションシステム。近くのオブジェクトを検出し、選択し、即時またはホールドで操作できます。UI 用イベントも標準搭載。

OmniInteraction を使うと、任意のアクターが周囲のインタラクト可能なオブジェクトを見つけて操作できるようになります。キャラクターにコンポーネントを 1 つ追加し、対象オブジェクトにインターフェースを 1 つ実装するだけで、検出、視線チェック、選択リスト、ホールド操作、UI イベントがすべて利用できます。
OmniInteraction を有効にし、エディタを再起動します。Interaction System を追加します。Interactable を追加します。Interact、Get Interact Text、Get Interact Icon、Get Interaction Duration、Should Remove On Interact をオーバーライドします。Interact(Get Current Index)、離した時に Stop Interact、スクロール時に Index Up / Down を呼び出します。任意のアクターに IInteractable を実装します。すべての関数は Blueprint Native Event なので、Blueprint で実装することも、C++ で _Implementation をオーバーライドすることもできます。
| 関数 | 戻り値 | 用途 |
|---|---|---|
Interact(Interactor) | void | インタラクト成功時に呼ばれます。Interactor はコンポーネントのオーナーです。 |
GetInteractText | String | UI に表示するラベル(例: 「剣を拾う」)。毎フレーム取得されるため、動的に変更できます。 |
GetInteractIcon | Texture2D | UI エントリ用の任意のアイコン。 |
GetInteractionDuration | float | 0 = 即時。0 より大きい値 = プレイヤーがホールドすべき秒数。 |
ShouldRemoveOnInteract | bool | true の場合、インタラクト成功後にリストから削除されます(拾得アイテム、消耗品など)。 |
OnHighlightStart | void | アイテムが選択状態になった時に呼ばれます。アウトラインや発光に使用できます。 |
OnHighlightEnd | void | 選択が外れた時、または範囲外に出た時に呼ばれます。 |
class AMyPickup : public AActor, public IInteractable
{
GENERATED_BODY()
public:
virtual void Interact_Implementation(AActor* Interactor) override;
virtual FString GetInteractText_Implementation() override { return TEXT("Pick up"); }
virtual float GetInteractionDuration_Implementation() override { return 0.0f; }
virtual bool ShouldRemoveOnInteract_Implementation() override { return true; }
};
クラス: UInteractionSystem(Actor Component)。インタラクトを行うアクターに追加します。
| プロパティ | デフォルト | 説明 |
|---|---|---|
InteractionRadius | 90.0 | 検出半径(Unreal 単位)。Blueprint で読み書き可能。 |
bWrapSelection | false | スクロール時に、最後から最初(およびその逆)へ選択をループさせます。 |
bShowDebugRadius | false | 検出範囲の球を描画します。待機中は緑、ホールド中は赤。 |
bShowDebugState | false | 選択中のインデックス、アイテム一覧、ホールド進行度を画面に表示します。 |
| 関数 | 種類 | 説明 |
|---|---|---|
Interact(Index) | Callable | 指定した Index のアイテムを操作します。即時アイテムは直ちに実行され、ホールドアイテムはタイマーが開始されます。 |
StopInteract | Callable | 現在のホールドをキャンセルし、進行度をリセットします。入力を離した時に呼び出します。 |
IndexUp / IndexDown | Callable | 選択を移動し、ハイライトの開始 / 終了を発火します。 |
InteractAll(bOnlyInstant) | Callable | 近くのすべてのアイテムを操作します。デフォルトでは即時アイテムのみが対象です。 |
ClearAllInteractables | Callable | リストを空にし、ホールドをキャンセルします。 |
RegisterWidgetReference(Widget) | Callable | 作成したウィジェットを次のアイテムスロットに紐付け、後で正しく削除できるようにします。 |
GetHoldProgress | Pure | 0 から 1。プログレスバーにバインドして使用します。 |
GetCurrentIndex | Pure | 現在選択中のインデックス。 |
GetSelectedActor | Pure | 選択中のアクター。なければ null。 |
IsHoldInteractionAtIndex(Index) | Pure | アイテムがホールドを必要とする場合 true。 |
GetUpdatedTextAtIndex(Index) | Pure | アイテムの現在のインタラクトテキスト。 |
GetDistanceToInteractable(Index) | Pure | オーナーからアイテムまでの距離。 |
Blueprint(Assign ノード)または C++(AddDynamic)でバインドします。
| イベント | パラメータ | 発火タイミング |
|---|---|---|
OnItemEntered | ItemName, ItemIcon | 新しいインタラクト可能オブジェクトが範囲内に入り、視認できる時。 |
OnItemRemoved | WidgetRef, Index | アイテムが範囲外に出た時、または消費された時。ウィジェットの破棄に使用します。 |
OnSelectionChanged | NewSelectedIndex | 選択中のインデックスが変わった時。 |
OnUpdateInteractionText | Index, NewText | 毎フレーム、各アイテムごとに発火。動的テキストを常に同期できます。 |
OnItemEntered をバインドします。エントリ用ウィジェット(名前 + アイコン)を作成し、Vertical Box に追加します。RegisterWidgetReference を呼び出します。入ってきたアイテム 1 つにつきウィジェット 1 つです。OnItemRemoved をバインドし、WidgetRef に対して Remove From Parent を呼び出します。OnSelectionChanged をバインドし、NewSelectedIndex のエントリをハイライトします。OnUpdateInteractionText をバインドし、Index のラベルを更新します。GetHoldProgress でプログレスバーを動かします。bShowDebugState を有効にすると、システムが何を追跡しているか確認できます。Interactable を実装しているか、半径内にあるか、Visibility チャンネルに反応するコリジョンがあるかを確認してください。自分とオブジェクトの間に壁がある場合も検出されません。Interactor は単にオーナーとなります。GetInteractionDuration で 0 より大きい値を返します。押下時に Interact、離した時に Stop Interact を呼び出してください。