OmniInteraction

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

概要

OmniInteraction を使うと、任意のアクターが周囲のインタラクト可能なオブジェクトを見つけて操作できるようになります。キャラクターにコンポーネントを 1 つ追加し、対象オブジェクトにインターフェースを 1 つ実装するだけで、検出、視線チェック、選択リスト、ホールド操作、UI イベントがすべて利用できます。

範囲検出オーナーを中心に球状でスキャン。半径は自由に設定できます。
視線チェック壁の向こうにあるオブジェクトは自動的に無視されます。
複数アイテムの選択IndexUp / IndexDown で切り替え。ラップアラウンドも任意で有効にできます。
即時 / ホールド各オブジェクトが自分の操作時間を決定。進行度は UI バー用に取得できます。
UI 向けイベント進入、削除、選択変更、テキスト更新のデリゲートを用意。
デバッグ機能内蔵範囲の描画と、インタラクション状態の画面表示に対応。

クイックスタート

  1. プラグインを有効化
    Edit → Plugins で OmniInteraction を有効にし、エディタを再起動します。
  2. コンポーネントを追加
    キャラクター(または任意のアクター)の Blueprint を開き、Interaction System を追加します。
  3. インターフェースを実装
    操作したいオブジェクトで Class Settings → Interfaces から Interactable を追加します。
  4. 関数を実装
    Interact、Get Interact Text、Get Interact Icon、Get Interaction Duration、Should Remove On Interact をオーバーライドします。
  5. 入力を接続
    押下時に Interact(Get Current Index)、離した時に Stop Interact、スクロール時に Index Up / Down を呼び出します。
  6. プレイ
    オブジェクトに近づくと、自動的に検出されハイライトされます。
コリジョンの要件: インタラクト可能なアクターには、Visibility チャンネルに Overlap または Block するコリジョンコンポーネントが必要です。設定されていないとスキャンで検出されません。

Interactable インターフェース

任意のアクターに IInteractable を実装します。すべての関数は Blueprint Native Event なので、Blueprint で実装することも、C++ で _Implementation をオーバーライドすることもできます。

関数戻り値用途
Interact(Interactor)voidインタラクト成功時に呼ばれます。Interactor はコンポーネントのオーナーです。
GetInteractTextStringUI に表示するラベル(例: 「剣を拾う」)。毎フレーム取得されるため、動的に変更できます。
GetInteractIconTexture2DUI エントリ用の任意のアイコン。
GetInteractionDurationfloat0 = 即時。0 より大きい値 = プレイヤーがホールドすべき秒数。
ShouldRemoveOnInteractbooltrue の場合、インタラクト成功後にリストから削除されます(拾得アイテム、消耗品など)。
OnHighlightStartvoidアイテムが選択状態になった時に呼ばれます。アウトラインや発光に使用できます。
OnHighlightEndvoid選択が外れた時、または範囲外に出た時に呼ばれます。

C++ の例

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)。インタラクトを行うアクターに追加します。

プロパティ

プロパティデフォルト説明
InteractionRadius90.0検出半径(Unreal 単位)。Blueprint で読み書き可能。
bWrapSelectionfalseスクロール時に、最後から最初(およびその逆)へ選択をループさせます。
bShowDebugRadiusfalse検出範囲の球を描画します。待機中は緑、ホールド中は赤。
bShowDebugStatefalse選択中のインデックス、アイテム一覧、ホールド進行度を画面に表示します。

関数

関数種類説明
Interact(Index)Callable指定した Index のアイテムを操作します。即時アイテムは直ちに実行され、ホールドアイテムはタイマーが開始されます。
StopInteractCallable現在のホールドをキャンセルし、進行度をリセットします。入力を離した時に呼び出します。
IndexUp / IndexDownCallable選択を移動し、ハイライトの開始 / 終了を発火します。
InteractAll(bOnlyInstant)Callable近くのすべてのアイテムを操作します。デフォルトでは即時アイテムのみが対象です。
ClearAllInteractablesCallableリストを空にし、ホールドをキャンセルします。
RegisterWidgetReference(Widget)Callable作成したウィジェットを次のアイテムスロットに紐付け、後で正しく削除できるようにします。
GetHoldProgressPure0 から 1。プログレスバーにバインドして使用します。
GetCurrentIndexPure現在選択中のインデックス。
GetSelectedActorPure選択中のアクター。なければ null。
IsHoldInteractionAtIndex(Index)Pureアイテムがホールドを必要とする場合 true。
GetUpdatedTextAtIndex(Index)Pureアイテムの現在のインタラクトテキスト。
GetDistanceToInteractable(Index)Pureオーナーからアイテムまでの距離。

イベント

Blueprint(Assign ノード)または C++(AddDynamic)でバインドします。

イベントパラメータ発火タイミング
OnItemEnteredItemName, ItemIcon新しいインタラクト可能オブジェクトが範囲内に入り、視認できる時。
OnItemRemovedWidgetRef, Indexアイテムが範囲外に出た時、または消費された時。ウィジェットの破棄に使用します。
OnSelectionChangedNewSelectedIndex選択中のインデックスが変わった時。
OnUpdateInteractionTextIndex, NewText毎フレーム、各アイテムごとに発火。動的テキストを常に同期できます。

UI のセットアップ(Blueprint)

  1. OnItemEntered をバインドします。エントリ用ウィジェット(名前 + アイコン)を作成し、Vertical Box に追加します。
  2. 作成直後に、そのウィジェットを渡して RegisterWidgetReference を呼び出します。入ってきたアイテム 1 つにつきウィジェット 1 つです。
  3. OnItemRemoved をバインドし、WidgetRef に対して Remove From Parent を呼び出します。
  4. OnSelectionChanged をバインドし、NewSelectedIndex のエントリをハイライトします。
  5. OnUpdateInteractionText をバインドし、Index のラベルを更新します。
  6. ホールド操作では、GetHoldProgress でプログレスバーを動かします。

ヒントとベストプラクティス

半径は小さくスキャンは毎フレーム実行されます。半径が小さいほど負荷が低く、操作感も正確になります。
デバッグ切り替えを活用bShowDebugState を有効にすると、システムが何を追跡しているか確認できます。
動的テキストGetInteractText で「ドアを開ける」「ドアを閉める」のように状態に応じた文字列を返せます。
ハイライトは安全にハイライト処理は OnHighlightStart / End の中だけで行い、選択状態の一貫性を保ちます。

FAQ

オブジェクトが検出されません。

AI やプレイヤー以外のアクターでも使えますか?

ホールド操作はどう作りますか?

Enhanced Input に対応していますか?


Copyright KhalidBen 2026. All rights reserved.