37.

UE5でSpawnしたインスタンスのイベントを実行する方法|参照の保持とExpose On Spawn

編集

Unreal Engine 5(UE5)でSpawnActorなどによって生成したインスタンスにイベントや関数を実行させるには、Spawn Actor from Classノードの戻り値(Return Value)=生成されたインスタンスへの参照を保持し、その参照から対象のカスタムイベントや関数を呼び出します。生成しただけでは外部から命令を送れないため、「参照をつかんでおくこと」が出発点になります。

この記事の要点
  • Spawnしたインスタンスへイベント/関数を呼ぶには、Spawn Actor from Class の Return Value(生成インスタンスへの参照)を保持し、そこから呼び出す。
  • 基本の流れは「Spawn Actor from Class → Return Value を変数に保持(または直接ドラッグ)→ 対象のカスタムイベント/関数を呼ぶ」。
  • BeginPlayより前に初期値を渡したい場合は、変数のExpose On Spawnを有効にし、Spawnノード上のピンへ値を入力する。
  • よくある失敗は「参照を保持し忘れて呼べない」「Castを忘れて目的のイベントが見えない」「Spawn失敗でNull参照」「呼ぶタイミングのずれ」。

基本の考え方:戻り値=生成インスタンスへの参照

UE5のSpawn Actor from Class(C++ではSpawnActor)は、ワールドに新しいアクターを生成し、その生成されたインスタンスへの参照を Return Value として返します。この参照こそが「どのインスタンスに命令するか」を指し示すものです。

UE5のブループリントでは、あるアクターのカスタムイベントや関数を外部から呼ぶには、「対象インスタンスへの参照」と「呼びたいイベント/関数」を線でつなぐ必要があります。Spawnの戻り値はまさにその「対象インスタンスへの参照」なので、これを保持しておけば、後からいつでもそのインスタンスのイベントを実行できます。

逆に言えば、戻り値を受け取らずにSpawnしただけだと、生成されたインスタンスは存在していても外部から名指しできる参照がないため、特定の関数やイベントを呼ぶことができません。

手順:Spawnしたインスタンスのイベントを呼ぶ

ここでは、スポーン元(例:BP_Spawner)からスポーン先(例:BP_SpawnedActor)のカスタムイベントを呼ぶ流れを示します。

1呼ばれる側に処理を用意する
BP_SpawnedActor を開き、イベントグラフでカスタムイベント(例:StartBehavior)または関数を作成し、実行したい処理(移動開始、エフェクト再生、Print Stringなど)をつなぐ。
2Spawnノードを置く
BP_Spawner 側に Spawn Actor from Class ノードを追加し、Class に BP_SpawnedActor を指定する。
3Return Value(参照)を保持する
Spawnノードの Return Value を、ドラッグして変数に昇格(Promote to Variable)するか、続く処理へ直接ドラッグする。複数回・後のタイミングで呼ぶなら変数保持が便利。
4対象のイベント/関数を呼ぶ
保持した参照(または Return Value)からドラッグして、手順1で作った StartBehavior などを検索・配置し、実行ピンをつなぐ。これでそのインスタンスに対してイベントが実行される。

Return Value の型が呼びたいクラス(BP_SpawnedActor)と一致していれば、その参照からドラッグするだけで、対象クラスのカスタムイベントや公開関数が候補として表示されます。

具体例:生成した敵キャラに「行動開始」を命令する

敵アクター BP_Enemy を生成し、生成直後に行動を開始させる例です。

BP_Enemy 側:

  • カスタムイベント StartChase を作成し、ターゲットに向かって移動する処理などをつなぐ。

BP_Spawner(生成する側)側のノードの流れ:

[Spawn Actor from Class]

 Class = BP_Enemy

 Spawn Transform = 出現させたい位置・回転

 Return Value ──▶ [SET] EnemyRef(BP_Enemy型の変数に保持)

           │

           ▼

 EnemyRef ──▶ [StartChase](BP_Enemyのカスタムイベントを呼ぶ)

このように、Return Value を変数 EnemyRef に保持しておけば、生成直後だけでなく、後のフレームや別のイベントからも EnemyRef を通じて同じインスタンスへ命令を送れます。

BeginPlayより先に値を渡したい場合:Expose On Spawn

「生成と同時に初期パラメータ(HP、移動速度、ターゲットなど)を渡したい」場合、手順4でイベントを呼ぶ方式だとBeginPlayが先に走ってしまい、初期化に間に合わないことがあります。

このようなケースでは、変数のExpose On Spawnを使うと、Spawnノード上で直接、生成時に値を入力できます。手順は次の通りです。

  • BP_SpawnedActor 側で変数(例:MaxHP)を作成し、詳細パネルで Instance EditableExpose On Spawn を有効にする。
  • すると BP_Spawner 側の Spawn Actor from Class ノードに、その変数の入力ピン(MaxHP)が現れる。
  • そこへ値を接続すると、生成時に値が設定された状態でインスタンスが作られる。

Expose On Spawn で渡した値は、一般にそのアクターのBeginPlayが実行されるよりも前に設定されるため、BeginPlay内でその初期値を前提とした処理を書けます。実行順序の厳密な仕様(特にComponentやネットワーク絡み)はバージョンや構成で挙動が異なる場合があるため、シビアな初期化順に依存する設計では公式ドキュメントの確認と実機での検証を推奨します。

落とし穴と対処

よくある失敗原因と対処
イベントを呼べない/呼ぶ相手がないReturn Value を保持し忘れている。Spawn後にイベントを呼ぶなら、必ず戻り値を変数に保持するか直接ドラッグして使う。
目的のカスタムイベント/関数が候補に出ない参照の型が汎用Actor型などになっている。Cast To(目的クラスへキャスト)してから、キャスト結果の参照を使う。変数の型自体を目的クラスにしておくとCast不要。
実行時にエラー(Accessed None)Spawnに失敗するとReturn ValueがNull(None)になる。Collision Handling設定や出現位置の衝突で生成が拒否されることがある。Is Validでチェックしてから呼ぶ。
呼んだのに何も起きない(タイミング)BeginPlayとの前後関係や、まだ初期化が終わっていない可能性。初期値の受け渡しは Expose On Spawn を検討し、外部からの呼び出しは生成完了後に行う。
マルチプレイで動作が安定しないアクターのSpawnやイベント呼び出しは権限(Authority/サーバー・クライアント)やレプリケーション設定の影響を受ける。ネットワーク前提の場合は権限とレプリケーションの仕様を公式ドキュメントで確認のうえ設計する。

応用:イベントディスパッチャーで「呼ばれる側→呼ぶ側」へ通知

ここまでは「生成側 → 生成インスタンス」へ命令する方向でした。逆に、生成インスタンス側で起きた出来事を生成元へ通知したい場合は、イベントディスパッチャーが便利です。

  • BP_SpawnedActor にイベントディスパッチャーを作成し、通知したいタイミングでCall(呼び出し)する。
  • 生成元では、保持しておいた参照(EnemyRefなど)から Bind Event to ~(ディスパッチャー名) を行い、受け取り側の処理をバインドする。

これにより、生成元のアクターは、各インスタンスからの通知(例:敵が倒された、ゴールに到達した)を受け取って連携処理を実行できます。バインドにも生成インスタンスへの参照が必要な点は共通です。

FAQ

Q. Return Value を変数に保持せず、直接イベントを呼んでも問題ないですか?
A. 生成直後に一度だけ呼ぶなら、Return Value から直接ドラッグして呼んで問題ありません。ただし、後のフレームや別のイベントから同じインスタンスを操作したい場合は、変数に保持しておかないと参照を失います。用途に応じて使い分けてください。

Q. 生成と同時に値を渡すのと、生成後にイベントで渡すのはどちらが良いですか?
A. 「BeginPlayより前に確定していてほしい初期値」は Expose On Spawn でSpawn時に渡すのが確実です。一方、生成後の状況に応じて動的に命令したい処理は、参照経由でカスタムイベント/関数を呼ぶ方式が向いています。両者は併用できます。

Q. C++でも同じ考え方ですか?
A. 基本は同じで、SpawnActorが返すポインタ(生成インスタンスへの参照)を保持し、そのポインタ経由でメンバ関数やイベントを呼びます。ポインタが有効か(nullでないか)の確認や、Spawnパラメータ・テンプレートの扱いなど細部はAPIに依存するため、正確な記述は公式ドキュメントの確認を推奨します。

まとめ

  • Spawnしたインスタンスにイベント/関数を実行させる鍵は、Return Value(生成インスタンスへの参照)を保持し、そこから呼ぶこと。
  • 流れは「Spawn Actor from Class → Return Value を保持 → 対象のカスタムイベント/関数を呼ぶ」。
  • BeginPlayより前に初期値を渡したいなら Expose On Spawn、生成側へ通知したいならイベントディスパッチャー
  • 参照の保持忘れ・Cast忘れ・Spawn失敗によるNull・呼ぶタイミングに注意。シビアな実行順やマルチプレイ仕様は公式ドキュメントで確認を。
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ