banner
YZ

周周的Wiki

种一棵树最好的时间是十年前,其次是现在。
zhihu
github
csdn

虚幻エンジンゲームプレイ:アクター間の効率的な通信とインタラクション技術の探求

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 を開く -- 新しいプロジェクトを作成 -- ゲームを選択 -- サードパーソンゲームを選択 -- 初心者コンテンツパッケージにチェックを入れる。

image.png
このデモは最新の Unreal Engine バージョン 5.4 で構築されています。

直接通信#

この例では、サードパーソンキャラクター Actor ブループリントが Cube の表示 / 非表示を制御することで、直接通信方法の使用を示します。

  1. BP_Cube ブループリントを作成
    コンテンツサイドメニューを開く -- コンテンツメニューの下に MyBlueprints ディレクトリを新規作成 -- 右クリックメニューからブループリントクラスを選択 -- 一般の下の Actor クラスを選択 -- 名前を BP_Cube とする。
    image.png

  2. 静的マテリアルを追加
    BP_Cube をダブルクリックして開く -- 左側のコンポーネントウィンドウで追加をクリック --Cube を検索して選択する。
    image.png

  3. BP_Cube ブループリントを作成
    左側のブループリントで関数リストを見つける --+ ボタンをクリックして関数を追加 -- 名前を OnCubeVisible とする -- キーボードの Ctrl キーを押しながら Cube 変数をブループリントにドラッグする --Cube ピンから線を引き出して放す --Set Visibility関数を検索して選択する。
    image.png

  4. 関数に引数を追加
    OnCubeVisible 関数を選択 -- 右側の詳細パネルの入力欄で + ボタンをクリック -- ブール変数 IsVisible を追加 -- 関数引数 Is Visible ピンを Set Visibility の new Visibility に接続 -- ブループリントをコンパイルして保存する。
    image.png

  5. サードパーソンブループリント BP_ThirdPersonCharacter にキーイベントを追加
    コンテンツメニューで BP_ThirdPersonCharacter を検索してダブルクリックで開く -- ブループリントの空白部分で右クリックして数字キー 0 イベント(Keyboard Eventsノード)を検索する。
    image.png
    Pressedピンから線を引き出して放し、Get Actor Of Classノードを検索する --Actor Classピンのドロップダウンから BP_Cube を検索して選択 --Flip Flopノードに接続 --return value ピンから On Cube Visible 関数に接続する。具体的な接続図は以下の通り:
    image.png

  6. Actor オブジェクト BP_Cube をコンテンツメニューからシーンにドラッグ&ドロップし、テストを実行する。数字キー 0 を押し続けることで表示 / 非表示が切り替わる。
    cube.gif

型変換通信#

この例では、サードパーソンキャラクター Actor ブループリントが Cube の回転を制御することで、型変換通信方法の使用を示します。
PracticeProject プロジェクトを引き続き使用してこの部分の作業を完了します。

  1. BP_Cube ブループリントに回転ロジックを記述
    BP_Cube ブループリントをダブルクリックして開く -- 変数バーに IsRotate 変数を追加 -- イベントグラフでEvent Tickノードを見つける -- その実行ピンを引き出してBranch分岐ノードに接続 --True ピンをAdd Actor Local Rotationノードに接続 --Delta Rotation ピンの Z に任意の値を入力 --IsRotate 変数を引き出して Branch の Condition ノードに接続する。
    image.png
    最後に IsRotate を公開変数に設定します(他のブループリント設定用)。

  2. BP_ThirdPersonCharacter ブループリントに衝突関数を追加
    Capsule Component で右クリックしてイベントを追加 --On Component Begin OverlayOn Component End Overlap関数をイベントグラフに追加する。
    image.png

  3. 型変換呼び出しロジックを記述
    Begin ノードで、Other Actorピンから引き出してCast To BP_Cubeノードに接続 --As BP Cube ノードからSet Is Rotateノードに接続 --Is Rotate ピンをチェックする。
    同様に End ノードを設定しますが、最後の Is Rotate ピンのチェックを外す必要があります。以下の図のように。
    image.png

  4. キャラクター Pawn の衝突プリセットを設定
    キャラクターが重なり衝突を発生させるためには、コンポーネントの衝突プリセット設定を WorldDynamic にチェックする必要があります。
    image.png

  5. テストを実行し、Cube に近づくと回転し、離れると回転を停止します。
    rotate.gif

イベントディスパッチャー通信#

Unity のデリゲートイベントに似て、グローバルまたはローカルに公開されたイベントディスパッチャーは、必要なスクリプトが自由に購読できます。イベントディスパッチャーを購読すると、イベントがトリガーされたときに、これらの購読者はメッセージを受け取り、それぞれのロジックを処理できます。

  1. イベントディスパッチャーを持つ Actor を作成
    コンテンツメニューで Actor タイプのブループリントクラスを新規作成 -- 名前を BP_EeventActor とする --Box コンポーネントを追加 -- マイブループリントのイベントディスパッチャー欄に + ボタンを追加 -- イベントディスパッチャーを追加し、名前を OnBoxEvent とする -- イベントグラフに On Component Begin Overlay イベントを追加 -- イベントディスパッチャーをグラフにドラッグして呼び出しを選択し、接続図は以下の通り:
    image.png
    コンパイルして保存し、シーン内の任意の位置に配置します。
    image.png
  2. 最初のイベント受信者 Actor を作成 --BP_CircularReceive
    ブループリントロジックを記述し、4 つの QuarterCylinder を非表示にします。
    変数を 1 つ追加し、名前を EventActor とし、詳細パネルで変数タイプを BP_EevntActor に設定し、公開変数に設定します -- 変数を 1 つ追加し、名前を CylinderList とし、詳細パネルで変数タイプを Static Mesh Actor(配列タイプ)に設定し、公開に設定します --EvenActor 変数の詳細パネルのイベント欄で On Box Event の右側の + ボタンを追加し、ロジックを記述します:
    image.png
    BP_CircularReceive をシーンにドラッグ&ドロップし、詳細パネルで変数の参照を設定します:
    image.png
  3. 2 番目のイベント受信者 Actor を作成 --BP_ExplosionActor
    コンテンツメニューでBlueprint_Effect_Explosionを検索し、自分の定義したフォルダーにコピーして BP_ExplosionActor と名前を付けます -- シーン内の円柱の位置にドラッグし、少し位置を調整して円柱の中央に配置します。同様に変数 Eventor を追加し、そのイベントを完成させ、ここでは爆発効果を有効にします。
    image.png
    さらに、2 つの子コンポーネント P_Explosion と ExplosionAudio の自動起動属性をオフにする必要があります。最後にシーンに配置し、変数の参照を設定します:
    image.png
  4. イベントディスパッチャーの効果をテスト
    event.gif

インターフェース通信#

UE5 における Actor インターフェース通信は非常に効果的な設計パターンであり、インターフェースは一連の共通の動作や機能を定義します。これらの動作や機能は異なる Actor で異なる実装方法を持つことができます。異なる Actor に同じタイプの機能を実装する場合、この通信方法を使用するのが適しています。

この例では、2 つの異なる Actor 間で通信するシンプルなインタラクションシステムを実装し、インターフェースの使用法を学びます。

  1. インターフェースを作成
    ディレクトリの空白部分で右クリックしてブループリントインターフェースクラスを作成します。
    image.png
    ダブルクリックして開き、関数を追加して名前を Interaction とします。
    image.png
  2. インタラクティブなスイッチのライトを作成
    コンテンツメニューでBlueprint_CeilingLightを検索し、自分のディレクトリにコピーして BP_Light と名前を付けます -- シーンに配置します。
    ダブルクリックしてブループリントを開き、クラス設定でインターフェース BPI_Interaction を追加し、コンパイルして保存した後、マイブループリントのインターフェース欄で Interaction インターフェースを右クリックして実装イベントを選択すると、Event Interaction ノードが自動的にブループリントに追加されます。
    image.png
    スイッチのロジックを記述します:
    image.png
  3. インタラクティブな球体を作成
    新しい Actor ブループリントクラスを作成し、名前を BP_Sphere とし、球体コンポーネントを追加します。同様にインターフェース Interaction を追加し、マテリアルを切り替えるロジックを実装します:
    image.png
  4. プレイヤーブループリントを修正し、インターフェースイベントをテスト
    ブループリント BP_ThirdPersonCharacter を見つけ、その OnComponent Begin Overlap イベントに Interaction (Message) ノードを追加します。
    image.png
    コンパイルして保存し、実行します:
    interface.gif

まとめ#

  1. 直接通信

    • シンプルなシーンに適しており、特定の Actor と直接対話する必要がある場合に非常に効果的です。正しい参照を持っていることを確認する必要があります。
  2. 型変換

    • 特定のクラスの機能や属性にアクセスする必要がある場合、型変換は良い選択です。ランタイムで Actor の特定の機能を検証し、アクセスすることを可能にします。
  3. イベントディスパッチャー

    • イベントをブロードキャストする必要があるシーンに適しており、複数の Actor が同じイベントに応答できるようにし、システムの柔軟性と拡張性を高めます。
  4. インターフェース

    • 異なるタイプの Actor に共通の機能を追加するための柔軟な方法を提供します。インターフェースを実装することで、コードの重複を減らし、保守性を向上させることができます。

これら 4 つの通信方法を通じて、開発者は Unreal Engine 内で Actor 間の相互作用を効率的に管理し、複雑なゲームロジックを構築できます。適切な通信方法を選択することで、コードの可読性と保守性を向上させ、プロジェクトをよりモジュール化することができます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。