【Unreal Engine】アクター間通信の3つの方法:Direct Reference、Interface、Event Dispatcher

作成: 2025-12-12最終更新: 2026-07-19

Blueprintのアクター間通信3方式(Direct Reference・Interface・Event Dispatcher)を「直通・手紙・放送」の比喩で図解。1つの仕掛けで3方式を適材適所に使う実践つき。

「スイッチを踏んだら、ドアを開けたい」。やりたいことは単純ですが、スイッチはどうやってドアに「開け」と伝えればよいのでしょうか。アクターが2つ登場した瞬間、UE開発は「通信」の問題になります。

Blueprintの通信手段は主に3つ。 Direct Reference(直通電話)Interface(宛名のいらない手紙)Event Dispatcher(ラジオ放送) です。どれでも動きますが、選び方を間違えると、プロジェクトが育ったときの修正コストが桁違いになります。

この記事では、3方式の違いと使い分けを比喩と図で解説します。最後に「ボタンで橋が架かる仕掛け」を3方式で組む実践も紹介します。

糸電話で話す2体の人形と、床に置かれた封筒とメガホン。3つの通信方法のイメージ

この記事でわかること

  • 3方式の本質は 「直通・手紙・放送」
  • 結合度 で選ぶ考え方(相手が固定なら直通、相手が多様なら手紙、相手が不特定なら放送)
  • よくある事故( 全部Direct ReferenceUnbind忘れ )の防ぎ方
  • 実践:1つの仕掛けで 3方式を適材適所 に使い分ける

Sponsored

全体像:直通・手紙・放送

3つの通信方法。Direct Referenceは決まった相手と直通、Interfaceは同じ頼みごとを誰にでも、Event Dispatcherは聴きたい人が聴く放送
方式比喩結合度主な用途
Direct Reference直通電話高い(密結合)特定の1体との固定的なやり取り
Interface宛名のいらない手紙低い(疎結合)「同じ頼みごと」を多様な相手へ
Event Dispatcherラジオ放送最も低い不特定多数への一斉通知

覚え方はシンプルで、 相手が固定なら直通、相手が多様なら手紙、相手が不特定なら放送 です。それぞれ順に見ていきましょう。

Direct Reference:決まった相手との直通電話

最もシンプルな方法です。相手のアクターへの 参照(Reference)を変数に持ち、関数を直接呼びます 。「このドアの、OpenDoorを実行して」という名指しの通話にあたります。

BP_Player のイベントグラフ(変数 TargetDoor: BP_Door型)
Is Valid(TargetDoor) → True → TargetDoor の OpenDoor を呼ぶ
直結ケーブルは速くて確実だが、相手を扉から宝箱に替えると壊れる。直通は、相手が固定のときだけ
メリットデメリット
実装が簡単・処理の流れが追いやすい密結合 :参照先のクラスに縛られる
確実で速い相手が変わる・増えると、参照元をすべて修正

使いどころは 相手が特定の1体で、構造が固定されている とき(親子関係、レベル内の1対1の対応付けなど)。なお、呼ぶ前の Is Valid チェックは習慣にしてください。相手が破壊済みだった場合のエラーを防げます。

Sponsored

Blueprint Interface:宛名のいらない手紙

Blueprint Interface は「このメッセージを受け取ったら、どう処理するかは受け取り側が決める」という 契約 です。送り手は相手の具体的なクラスを知る必要がありません(疎結合)。

代表例が「インタラクト」。プレイヤーはドア・宝箱・レバーの違いを知らず、目の前の相手にただ Interact の手紙を送ります。開くのか、フタが開くのか、倒れるのかは受け取った側の自由です。

プレイヤーのInteractメッセージが扉・宝箱・レバーに届き、それぞれ違う反応をする。受け取り方は、相手が決める

使い方は4ステップです。

  1. 作る: コンテンツブラウザで Blueprint Interface BPI_Interactable を作成し、Interact 関数を定義
  2. 実装宣言: BP_DoorBP_Chest のClass SettingsでこのInterfaceを追加
  3. 中身を書く: 各アクターに現れる Event Interact に、それぞれの反応を書く
  4. 送る: プレイヤー側は相手(Actor型のままでOK)に MessageノードInteract を送るだけ
メリットデメリット
疎結合 :相手のクラスを知らずに頼めるDirect Referenceより手順が多い
対応アクターを増やしても送り手は無修正処理が実装先に分散し、追跡がやや複雑

補足: Interfaceの関数には戻り値も定義できます(例: GetInteractionText で「開ける」「調べる」の表示文字列を返す)。深掘りはBlueprint Interfaceの記事へ。

Sponsored

Event Dispatcher:聴きたい人が聴く放送

Event Dispatcher は「一対多」の通知です。発生源はイベントを 放送(Call) するだけで、誰が聴いているかを知りません。聴きたい側が事前に バインド(受信登録) しておきます。オブザーバーパターンと呼ばれる設計です。

Event Dispatcherの塔は誰が聴いているか知らずに放送し、UI・音・実績が受信登録して聴く。発信者は放送するだけ
受信側(BP_ScoreUI の BeginPlay)
Bind Event to OnGameOver(発生源の参照が必要) → カスタムイベントを接続

発信側(BP_GameMode)
ゲームオーバー時 → OnGameOver を Call
メリットデメリット
1回の放送で 何人でも 受け取れるバインド/アンバインドの管理が必要
発信側は受信者を 一切知らない(最も疎結合)「誰が聴いているか」が見えず、流れを追いにくいことがある

「敵を倒した」を、スコアUI・ドロップ生成・実績システムが同時に聴く——このような ゲーム全体に波及するイベント が得意分野です。受信側が破棄されるときは Unbind Event を忘れずに。深掘りはEvent Dispatcherの記事へ。

Sponsored

使い分けのフローチャート

相手は特定の1体か、同じ頼みごとを違う相手に送るか、全員に知らせたいかで3方式に分かれるフローチャート
  1. 相手は特定の1体で、今後も変わらない? → Yes: Direct Reference(将来増えそうならInterfaceへ)
  2. 「同じ頼みごと」を、種類の違う複数の相手に送りたい? → Yes: Interface
  3. 起きたことを、興味のある全員に知らせたい? → Yes: Event Dispatcher

よくある事故は3つ——①全部Direct Referenceで済ませて、後から修正コストが爆発する。②Interfaceを実装宣言したのに Event ◯◯ ノードを置き忘れて、手紙が無視される。③Dispatcherのアンバインド忘れで、破棄済みアクターへ放送が届き続ける。

実践:ボタンで橋が架かる仕掛けを3方式で組む

3方式は「どれか1つを選ぶ」ものではなく、 1つの仕掛けの中で共存 します。題材は「ボタンを踏むと橋が架かる」——アクションのギミック、パズルの正解演出、RPGのショートカット解放。この1つの流れに、3方式を適材適所で配置してみましょう。

ボタンを踏むと橋が架かり、UI・音・実績へ放送が飛ぶ。1つの仕掛けに、3つの通信

再現用の準備: BP_FloorButton(床ボタン)、BP_Bridge(橋)、WBP_HUD(UI)の3つを用意し、次の変数とイベントを持たせます。

置き場所名前種類設定
BP_FloorButtonTargetBridgeBP_Bridge型の変数Instance Editable にチェック(レベル上で相手を指定するため)
BP_BridgeExtendカスタムイベント橋を架ける演出(Timelineでの移動など)
BP_BridgeOnBridgeExtendedEvent Dispatcher架かったことを知らせる放送口
  1. ボタン → 橋:Direct Reference: レベルに置いたボタンを選び、詳細パネルの Target Bridge で対応する橋を指定します。 このボタンとこの橋は1対1で固定 なので、直通電話の出番です

    BP_FloorButton
    On Component Begin Overlap(踏み判定のBox)
      → Is Valid(TargetBridge)
          Valid → DoOnce → TargetBridge の Extend を呼ぶ   ← 名指しの直通
    

    DoOnce を挟んでいるので、2回目に踏んでも何も起きません(橋は一度架かれば終わり、が仕様です)。何度も架け直すギミックにするなら、DoOnce の Reset ピンを叩いて再武装します。

  2. プレイヤー → ボタン:Interface: 「踏む」だけでなく「調べて起動」もできるようにするなら、BPI_Interactable(関数 Interact)を BP_FloorButton に実装します。プレイヤー側は相手の型を知らずに手紙を送るだけです

    BP_Player(Eキーを押したとき)
      → Line Trace で目の前のActorを取得
      → Interact(Message)(Target: ヒットしたActor)   ← 相手がボタンでもレバーでもOK
    
    BP_FloorButton
    Event Interact(BPI_Interactable の実装)
      → TargetBridge の Extend を呼ぶ   ← 踏んだときと同じ処理を再利用
    
  3. 橋 → みんな:Event Dispatcher: 架かった瞬間に放送します。橋は誰が聴いているか知りません

    BP_Bridge
    Event Extend
      → Timeline で橋を所定の位置へ移動
      → Finished → OnBridgeExtended を Call      ← 全方位への放送
    
    WBP_HUD(聴く側)
    Event Construct
      → Bind Event to OnBridgeExtended(Target: 橋の参照)
          Event ピン ← Custom Event: ShowAreaUnlocked
    ShowAreaUnlocked → 「新エリア解放」テキストを表示
    

「橋の参照」はどこから来る? ここが初心者最大のつまずきです。UIが特定の橋をBindするには参照が要りますが、Get All Actors Of Class で拾い集めるのは避けたいところ。橋が1本だけなら生成時にUIへ渡し、橋が複数あるゲームなら GameStateにベルを1つ置いて、すべての橋がそこへ鳴らす 手が定石です(→ Event Dispatcherの記事 のおまけ「中央Dispatcher」)。

3つを並べると、形の違いがそのまま「つながりの強さ」の違いになっているのが見えます。

Direct Reference・Interface・Event Dispatcherの3方式を3段に並べたノードグラフ比較図

Playしてボタンを踏むと、まず橋がTimelineで動き始め、 動き終わった瞬間(Finished後) にUIへ「新エリア解放」が出ます。もし橋が動いている最中に通知が出たなら、OnBridgeExtended のCallをFinishedではなくEvent Extendの直後に繋いでいるサインです。注目してほしいのは 拡張のしやすさの違い です。「ファンファーレも鳴らしたい」と思ったら、オーディオ担当は OnBridgeExtended にBindするだけで済み、 橋のBlueprintには一切触りません 。もし全部をDirect Referenceで組んでいたら、橋がUI・音・実績を名指しで知る羽目になり、橋のBlueprintは触るたびに壊れ物になっていきます。

ポイントは2つです。

  • 「知る必要があるか」で選ぶ: ボタンは橋を知るべき(1対1の仕掛け)。橋はUIを知る必要がない(結果の通知)。この線引きがそのまま方式の選択になります
  • 迷ったら疎結合側へ: Direct Referenceで書き始めて相手が2種類に増えたら、それはInterfaceかDispatcherへ乗り換えるサインです

おまけ:先に知っておくと良いこと

  • Component側の通信も同じ原則: 自作Componentから外への通知もEvent Dispatcherが定石です(→ Blueprint Componentの記事
  • 「全員が知っている場所」は通信不要: ゲーム全体のスコアや状態は、そもそもGameState / PlayerStateという公式の置き場があります。通信で配り回る前に、フレームワークに乗せられないか考えましょう
  • Castの多用は第4の(危険な)通信: Cast To BP_◯◯ で相手を特定クラスに変換して呼ぶ方法もありますが、密結合+メモリ面の欠点があります。詳しくはBlueprint InterfaceとCastingの記事で扱います

まとめ

  • Direct Reference=直通電話: 速くて確実。ただし相手が固定のときだけ
  • Interface=宛名のいらない手紙: 同じ頼みごとを、種類の違う相手へ。受け取り方は相手が決める
  • Event Dispatcher=ラジオ放送: 発信者は放送するだけ。聴きたい人が登録する
  • 選択の軸は 「相手を知る必要があるか」 。迷ったら疎結合側へ

次は各論です。Event Dispatcherによるイベント駆動設計で放送の実践パターンを、Blueprint Interfaceで実現する疎結合設計で手紙とCastの使い分けを深掘りしましょう。

あなたのプロジェクトでいちばん最近書いた「アクターからアクターへの連絡」は、直通・手紙・放送のどれでしたか?