Actor 通信紹介#
Actor は Unity の空の GameObject に似ており、シーンに自由に配置できるゲームオブジェクトです。UE は異なる Actor 間の通信方法をいくつか提供しており、この記事ではデモを通じて以下の表に示す 4 つの通信方法の要件と一般的な使用法を示します。
Actor 通信方法表:
通信方法 | 使用シーン | 前提条件 | 例 |
---|---|---|---|
直接通信 | 特定の Actor のメソッドを呼び出す必要がある場合 | シーン内の Actor を参照する必要がある | シーン内の特定の Actor でイベントをトリガーする。 |
型変換 | Actor が特定のクラスに属するかを確認して、その属性にアクセスしたい場合。 | シーン内の Actor を参照して、必要な Actor クラスに型変換する必要がある。 | 同じ親クラスに属する子 Actor の特定の機能にアクセスする。 |
イベントディスパッチャー | 1 つの Actor を通じて複数の Actor にイベントをトリガーする。 | 他の Actor がイベントを購読して、イベントに応答する必要がある。 | 異なるタイプの Actor に通知する:特定のイベントがトリガーされた。 |
インターフェース | 異なる Actor に同じ機能を追加する必要がある場合。 | シーン内の Actor を参照し、その Actor がインターフェースを実装する必要がある。 | 異なるタイプの Actor にインタラクション動作を追加する。 |
通信方法デモ#
準備作業#
Unreal Engine を開く -- 新しいプロジェクトを作成 -- ゲームを選択 -- サードパーソンゲームを選択 -- 初心者コンテンツパッケージにチェックを入れる。
本デモは最新の Unreal Engine バージョン 5.4 で構築されています。
直接通信#
この例では、サードパーソンキャラクター Actor のブループリントによって Cube の表示 / 非表示を制御し、直接通信方法の使用を示します。
-
BP_Cube ブループリントを作成
コンテンツサイドメニューを開く -- コンテンツメニューの下に MyBlueprints ディレクトリを新規作成 -- 右クリックメニューからブループリントクラスを選択 -- 汎用の下の Actor クラスを選択 -- 名前を BP_Cube とする。
-
静的マテリアルを追加
BP_Cube をダブルクリックして開く -- 左側のコンポーネントウィンドウで追加をクリック --Cube を検索して選択する。
-
BP_Cube ブループリントを作成
左側のブループリントで関数リストを見つける --+ ボタンをクリックして関数を追加 -- 名前を OnCubeVisible とする --Ctrl キーを押しながら変数 Cube をブループリントにドラッグする --Cube ピンから線を引き出して放す --Set Visibility関数を検索して選択する。
-
関数に引数を追加
関数 OnCubeVisible を選択 -- 右側の詳細パネルの入力欄で + ボタンをクリック -- ブール変数 IsVisible を追加 -- 関数引数 Is Visible ピンを Set Visibility の new Visibility に接続 -- ブループリントをコンパイルして保存する。
-
サードパーソンブループリント BP_ThirdPersonCharacter にキーイベントを追加
コンテンツメニューで BP_ThirdPersonCharacter を検索してダブルクリックで開く -- ブループリントの空白部分で右クリックして数字キー 0 イベント(Keyboard Eventsノード)を検索する。
Pressedピンから線を引き出してGet Actor Of Classノードを検索して接続 --Actor Classピンのドロップダウンから BP_Cube を検索して選択 --Flip Flopノードに接続 --return value ピンから On Cube Visible 関数に接続する。具体的な接続図は以下の通り:
-
Actor オブジェクト BP_Cube をコンテンツメニューからシーンにドラッグ&ドロップし、テストを実行する。数字キー 0 を押し続けることで表示 / 非表示が切り替わる。
型変換通信#
この例では、サードパーソンキャラクター Actor のブループリントによって Cube の回転を制御し、型変換通信方法の使用を示します。
PracticeProject プロジェクトを引き続き使用してこの部分の作業を完了します。
-
BP_Cube ブループリントで回転ロジックを作成
BP_Cube ブループリントをダブルクリックして開く -- 変数バーに IsRotate 変数を追加 -- イベントグラフでEvent Tickノードを見つける -- その実行ピンを引き出してBranch分岐ノードに接続 --True ピンをAdd Actor Local Rotationノードに接続 --Delta Rotation ピンの Z に任意の値を入力 -- 変数 IsRotate を引き出して Branch の Condition ノードに接続する。
最後に IsRotate を公開変数に設定します(他のブループリント設定用)。 -
BP_ThirdPersonCharacter ブループリントで衝突関数を追加
Capsule Component で右クリックしてイベントを追加 --On Component Begin OverlayとOn Component End Overlap関数をイベントグラフに追加する。
-
型変換呼び出しロジックを作成
Begin ノードで、Other Actorピンから線を引き出してCast To BP_Cubeノードに接続 --As BP Cube ノードからSet Is Rotateノードに接続 --Is Rotate ピンをチェックする。
同様に End ノードを設定しますが、最後の Is Rotate ピンのチェックを外す必要があります。以下の図のように。
-
キャラクター Pawn の衝突プリセットを設定
キャラクターが重なり衝突を発生させるためには、コンポーネントの衝突プリセット設定を WorldDynamic にチェックする必要があります。
-
テストを実行し、Cube に近づくと回転し、離れると回転を停止します。
イベントディスパッチャー通信#
Unity のデリゲートイベントに似て、グローバルまたはローカルに公開されたイベントディスパッチャーで、必要なスクリプトが自由に購読できます。イベントディスパッチャーを購読すると、イベントがトリガーされたときに、これらの購読者はメッセージを受け取り、それぞれのロジックを処理できます。
- イベントディスパッチャーを持つ Actor を作成
コンテンツメニューで Actor タイプのブループリントクラスを新規作成 -- 名前を BP_EeventActor とする --Box コンポーネントを追加 -- 私のブループリントのイベントディスパッチャーセクションで + ボタンを追加 -- イベントディスパッチャーを追加し、名前を OnBoxEvent とする -- イベントグラフに On Component Begin Overlay イベントを追加 -- イベントディスパッチャーをグラフにドラッグして呼び出しを選択し、接続図は以下の通り:
コンパイルして保存し、シーン内の任意の位置に配置します。
- 最初のイベント受信 Actor を作成 --BP_CircularReceive
ブループリントロジックを作成し、4 つの QuarterCylinder を非表示にします。
変数を 1 つ追加し、詳細パネルで変数タイプを BP_EevntActor に設定し、公開変数に設定します -- 変数 CylinderList を追加し、詳細パネルで変数タイプを Static Mesh Actor(配列タイプ)に設定し、公開に設定します --EvenActor 変数の詳細パネルのイベントセクションで On Box Event の右側の + ボタンを追加し、ロジックを作成します:
BP_CircularReceive をシーンにドラッグ&ドロップし、詳細パネルで変数の参照を設定します:
- 2 番目のイベント受信 Actor を作成 --BP_ExplosionActor
コンテンツメニューでBlueprint_Effect_Explosionを検索し、自分の定義したフォルダにコピーして BP_ExplosionActor と名前を付ける -- シーン内の円柱の位置にドラッグし、少し位置を調整して円柱の中央に配置します。同様に変数 Eventor を追加し、そのイベントを完成させ、ここでは爆発効果を有効にします。
また、2 つの子コンポーネント P_Explosion と ExplosionAudio の自動起動属性のチェックを外す必要があります。最後にシーンに配置し、変数の参照を設定します:
- イベントディスパッチャーの効果をテスト
インターフェース通信#
UE5 では、Actor インターフェース通信は非常に効果的なデザインパターンであり、インターフェースは一連の共通の動作や機能を定義します。これらの動作や機能は異なる Actor で異なる実装方法を持つことができます。異なる Actor に同じタイプの機能を実装する場合、この通信方法を使用するのが適しています。
この例では、2 つの異なる Actor 間で通信を行い、インターフェースの使用法を学ぶためにシンプルなインタラクションシステムを実装します。
- インターフェースを作成
ディレクトリの空白部分を右クリックしてブループリントインターフェースクラスを作成します。
ダブルクリックして開き、関数を追加して名前を Interaction とします。
- インタラクティブなスイッチのライトを作成
コンテンツメニューでBlueprint_CeilingLightを検索し、自分のディレクトリにコピーして BP_Light と名前を付ける -- シーンに配置します。
ダブルクリックしてブループリントを開き、クラス設定でインターフェース BPI_Interaction を追加し、コンパイルして保存した後、私のブループリントのインターフェースセクションで右クリックして Interaction インターフェースの実装イベントを選択すると、Event Interaction ノードが自動的にブループリントに追加されます。
交互にスイッチを入れるロジックを作成します:
- インタラクティブな球体を作成
新しい Actor ブループリントクラスを作成し、名前を BP_Sphere とし、球体コンポーネントを追加します。同様にインターフェース Interaction を追加し、材質を切り替えるロジックを実装します:
- プレイヤーブループリントを修正し、インターフェースイベントをテスト
ブループリント BP_ThirdPersonCharacter を見つけ、その OnComponent Begin Overlap イベントに実行ノード Interaction (Message) を追加します。
コンパイルして保存し、実行します:
まとめ#
-
直接通信:
- シンプルなシーンに適しており、特定の Actor と直接やり取りする必要がある場合に非常に効果的です。正しい参照があることを確認する必要があります。
-
型変換:
- 特定のクラスの機能や属性にアクセスする必要がある場合、型変換は良い選択です。実行時に Actor の特定の機能を検証し、アクセスすることができます。
-
イベントディスパッチャー:
- イベントをブロードキャストする必要があるシーンに適しており、複数の Actor が同じイベントに応答できるため、システムの柔軟性と拡張性が向上します。
-
インターフェース:
- 異なるタイプの Actor に共通の機能を追加するための柔軟な方法を提供します。インターフェースを実装することで、コードの重複を減らし、保守性を向上させることができます。
これら 4 つの通信方法を通じて、開発者は Unreal Engine 内で Actor 間の相互作用を効率的に管理し、複雑なゲームロジックを構築できます。適切な通信方法を選択することで、コードの可読性と保守性が向上し、プロジェクトがよりモジュール化されます。