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 つ追加し、名前を EventActor とし、詳細パネルで変数タイプを BP_EevntActor に設定し、公開変数に設定します -- 変数を 1 つ追加し、名前を 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 間の相互作用を効率的に管理し、複雑なゲームロジックを構築できます。適切な通信方法を選択することで、コードの可読性と保守性を向上させ、プロジェクトをよりモジュール化することができます。