single.php

Unreal Engineのイベントディスパッチャー(Event Dispatcher)の仕組みと使い方

ゲーム開発を試してみようと思い立ち、Unreal Engine 5をインストールして開発する過程で調べてみた部分を備忘録的に投稿します。今回は[イベント ディスパッチャー]の使い方です。

別クラスのイベントで処理を丸投げする

「イベント ディスパッチャー」をイメージで表すと、こんな感じになります。

他クラスにアクセスして処理する[ブループリント インターフェイス(Blueprint Interface)]とは違う仕組みで、別クラスにアクセスして処理をする仕組みです。

異なる点は「イベントを発生させるクラス」と「イベントを処理するクラス」とは別にそれぞれの処理を仲介するクラスがあることです。

例えば、[Level]上に[Actor]クラスと[Player]クラスが配置されていて、何かのイベントが発生した場合に処理がしたい場合[Event Dispatcher]は次のようなフローで動作します。

この時に、別クラスから変数などにアクセスして[Actor]と[Player]のクラスだけでも処理は可能なのに、なぜ[Event Dispatcher]が必要なのかという疑問です。

例えば[Player]クラスに記載されるのが簡単な処理の場合には、気になるほどの差ではありませんが[Actor]クラス以外に別のクラスの処理が必要になってきた場合に[Event Dispatcher]のメリットがあります。

レベル上に配置され[Player]クラスに何らかの影響を与える[Actor]クラスが100個あった場合[Player]クラスには100通りのイベントが必要になります。

それに加えて、クラス毎の処理を追加してしまうとイベント内の他クラスの取得時にクラスのロードが行われるため[Player]クラスは不必要なクラスをロードし続けるデメリットが生じます。

[Event Dispatcher]を使うと、発生したイベントの処理を仲介するクラスを作ることができるため

ほとんどのクラスが配置されている[Level]ブループリントを使うことで、不必要なクラスの読み込みが無くなるメリットもあります。

説明が長くなりましたが、実際に[イベント ディスパッチャー]を使う方法を紹介します。

近づくと全回復するアクター

先回は簡単なサンプルとしてレベルに配置したアクターに近づくと、キャラクターにダメージを受けるアクターで[ブループリントインターフェイス]の使い方を紹介しました。

今回はダメージを全回復するアクターを使って[イベント ディスパッチャー]を紹介します。

[ブループリント インターフェイス]に関する詳しい内容は別記事をご覧ください。

https://blog.janjan.net/2024/03/08/unreal-engine-use-interface-blueprints-communication/

全回復するアクターを作成

イベントディスパッチャーを追加するアクターを作成します。

具体的には次の手順で行います。

1. [コンテンツドロワー]を開いて空いている場所で右クリックして表示されるポップアップメニューで[ブループリント クラス]メニューを選択します。

2.[親クラスを選択]画面で[Actor]を選択します。

3. 追加された[ブループリント クラス]の名前を “BP_Treat” に変更します。

4.[BP_Treat]を開いて[コンポーネント]画面で[Sphere]と[Collision Box]を追加します。(サイズは適宜変更しておきます)

5. デバッグ用に[詳細]画面の[レンダリング|Hidden in Game]のチェックを外しておきます。

ここまでの作業で、レベルに配置するアクターが作成できました。

イベントディスパッチャーを追加

作成したクラスにイベントディスパッチャーを追加します。

具体的には次の手順で行います。

1. [BP_Treat]を開いて[マイブループリント]画面の[イベントディスパッチャー]の(+)をクリックして名前を “Treatment” に変更します。

2. 追加した[Treatment]を[イベントグラフ]にドラッグして表示されたポップアップメニューで[呼び出す]を選択します。

3.[Event ActorBeginOverlap]ノードの実行ピンを伸ばして[Call Treatment]を追加します。

ここまでの作業で、イベントディスパッチャーの追加ができました。

他クラスからのOverlapイベントが発生した際に[Treatment]ディスパッチャーが呼び出されることになります。

プレイヤーにライフを設定

ダメージ処理をするためにプレイヤーから減らすための「ライフ」を設定します。

具体的には次の手順で行います。

1. [コンテンツドロワー]を開いて[BP_ThirdPersonCharacter]を開きます。

2.[マイブループリント]画面の変数を追加して名前を[Life]に型を[Integer]に変更します。

3.[詳細]画面[デフォルト値]を適当な値(例 “100”)に設定します。

ここまでの作業で、プレイヤーにライフ(100)を設定できました。

ライフを全回復する処理

追加した[Treatment]ディスパッチャーが処理するイベントを追加します。

今回は[BP_ThirdPersonCharacter]クラスに追加していきます。具体的には次の手順で行います。

1. [BP_ThirdPersonCharacter]を開きます。

2. 表示された[イベントグラフ]の空いている場所でマウスの右ボタンをクリックして表示される[このブループリントで使えるノード]画面で “Add Custom Event” を検索して追加します。

3. 追加されたイベントノードの名前を[EventPlayerTreat]に変更します。

4.[マイブループリント]画面で[Life]変数をドラッグして表示されたポップアップメニューで[Set Life]を選択します。

5. 追加された[セット]ノードの[Life]の値を100に変更します。

6. デバッグ用に[Print String]ノードを追加して[Life]変数の値を表示します。

イベントディスパッチャーのバインドを追加

レベルにイベントディスパッチャーの起動部分を追加します。

特にレベルに追加する必要はありませんが、クラスの読み込み負荷を考えると、ほとんどのクラスを配置することになるレベルに追加するのが効率的です。

具体的には次の手順で行います。

1. [BP_Treat]をレベルにドラッグして配置します。

2. 配置された[BP_Treat]を移動して近づきやすい位置に調整します。

3.[レベルブループリントを開く]メニューを選択します。

4. 表示された[イベントグラフ]画面の空いている場所でマウスの右クリックして表示されえた[このブループリントで使えるノード]画面で “Event BeginPlay” を検索して追加します。

5. 続けて、空いている場所でマウスの右クリックして表示されえた[このブループリントで使えるノード]画面で[Create a Reference to BP_Treat]を検索して追加します。

6.[BP_Treat]ノードが追加されます。

7.[Event BeginPlay]の実行ピンを伸ばして表示された[すべてのノード]画面で “Bind Event to Treatment” を検索して追加します。

8. 追加された[Bind Event to Treatment]ノードの[Target]ピンと[BP_Treat]を接続します。

9.[Bind Event to Treatment]ノードの[Event]ピンを伸ばして表示された[デリゲート(リファレンス渡し)を提供する動作]画面で[Create Event]を検索して追加します。

10.[Create Event]ノードが追加されます。

11.[Create Event]ノードの[Object]ピンを伸ばして表示された[オブジェクト参照を提供する動作]画面で “Get Actor Of Class” を検索して追加します。

12.[Get Actor Of Class]ノードの[Actor Class]に[BP_ThirdPersonCharacter]を設定します。

13.[Create Event]ノードの[署名:()]の一覧から[EventPlayerTreat]を選択します。

13.[Get Actor Of Class]ノードを[Event BeginPlay]ノードと[Bind Event to Treatment]ノードの間に下のイメージのように接続し直します。

ここまでの作業でゲーム開始時に[Treatment]ディスパッチャーが登録されたイベントが発生した際に[EventPlayerTreat]イベントが動作するようになります。

イベントディスパッチャー処理の確認

追加した[Treatment]イベントディスパッチャーの処理を確認してみます。

ゲームを実行すると[Level]に追加した[Event BeginPlay]から[Treatment]イベントディスパッチャー([BP_Treat]アクターにオーバーラップしたら[BP_ThirdPersonCharacter]の[EventPlayerTreat]イベントを発生させる)が待機状態になります。

この状態では、イベントは発生しません。

プレイヤーを操作して[BP_Treat]アクターに近づけるとイベントディスパッチャーが動作して[EventPlayerTreat]が実行され[Life]に設定した値が表示されます。

左上に[Life]の値が表示されます。

まとめ

今回は、Unreal EngineのEvent Dispatcher(イベントディスパッチャー)について実装方法とメリットついて書きました。

ブループリントインターフェイスより、かなり面倒な実装になりますが、イベントの発生と処理するクラスを分けることができるので効率的に処理を追加できるメリットがあります。

また、クラス内で別クラスを参照するノードを減らすことができるのでロードによる負荷やメモリ使用量などで処理速度を速める効果もあります。

Unreal Engineのゲーム開発でブループリント間でイベントの編集を行う[イベントディスパッチャー]の実装について知りたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です