UE 他アクターを操作する
※個人用備忘録&素人による記事の為、間違いがある可能性があります
関連プラグイン
キャスト無しでディスパッチャーできる?
キャスト無しで他アクタ変数が呼び出せる?
出典
三大これがないともう無理プラグインhttps://t.co/aekWR96sJo
— RRR (@RRR30000) February 14, 2022
キャストしないで変数やり取りできるhttps://t.co/FQvZ5EbXzP
キャストしないでイベント呼び出せるhttps://t.co/sM6dA4FdZl
これのおかげでネコチアンがオンラインでキャッキャできる#UE4Study #UE4
参考
概要
「他アクターを操作」とは?
スイッチがあって
①プレイヤーが触れると(オーバーラップ)
②ドアが消える(Destroy)

の様な場合を想定
この場合 スイッチBP 内で ドアBPアクター を取得できればOK
重要なのは 他アクターを取得する 方法です。
それは下記記事にまとめました。
では更に別アクターのイベントを発動させたい場合どうするか?
・そもそもレベルブループリントで全部やる
・送信元で操作
・ブループリントインターフェース
・イベントディスパッチャー
・ブループリント関数ライブラリ(共通の処理)
Castとは?
そもそもCastって何?
Other Actorなどで取得したアクターの場合
それがThirdPersonCharacterなのか?何なのか?定義されてない訳です
それを「こいつはThirdPersonCharacterだよ!」とちゃんと定義する事です

ちなみにCastに繋ぐActorは親クラスであれば子クラスにキャストできます
例:Actor は ThirdPersonCharacter にキャストできる
レベルブループリント
レベルブループリントで全ての処理を書けば
依存関係が生まれない
① トリガーを選択
レベルブループリント開く
② 右クリック、オーバーラップイベントなどを作成
③ やりたい処理を作成
④ 操作したいアクターを選択
⑤ レベルブループリントで右クリック、参照を作成

送信元で操作
シンプルな操作(消す、動かすetc)をしたいだけの時
スイッチ(送信元)のBP内で
操作したい内容のノードのターゲットに
ドア(送信先)を繋げば良いだけです

他アクターのカスタムイベントor関数 もOK
1対1の関係で、複雑な処理がしたい場合
この方法は関数においても使えます
ドア(送信先)BP内にカスタムイベントを作成
任意のノードを繋げる

スイッチ(送信元)BP内で
上で作ったカスタムイベントを実行

イベントディスパッチャー
概要
基本的に1回限りしか使わない処理に使う印象
・1(送信元)対 多数(送信先)ができる
・レベルブループリントを使えば依存関係は生まれない
・レベルブループリントを使わないと依存関係が生まれる
なので特定のレベルでしか使わないアクターなどに使う?
・バインドをオフして、送信先が受信できないように出来る
・送信先に変数が送れる
・実行されるイベントは個々で決められる

手順
まず信号を送信元のアクターを開きます
① イベントディスパッチャーを作成、リネーム
② D&D
③ Callノードを作成、適当なイベントノードに繋げます。

次に
レベルブループリント(依存関係が生じない)もしくは
送信相手のアクター(依存関係が生じる)
を開きます
適当なイベントノードから繋げて
① 送信元アクターにキャストします
② イベントディスパッチャーに繋ぐ
A bind イベントディスパッチャー名 ノード
B bind の Eventピン から カスタムイベント作成
C 任意の実行したいノード

これはアクターに備わってるイベントを使う事もできます
例えばcrouch(あらかじめPlayer側で can crouch する必要がある)や
カスタムイベントもできます

変数の受け渡し
イベントディスパッチャーを使って変数を受け渡す事も出来ます
① イベントディスパッチャーを選択
② 変数名をリネーム
③ もし作成済イベントディスパッチャーであれば
右クリックRefresh Nodes

そしたら送信相手のカスタムイベントに変数ができてます。

ブループリントインターフェース
概要
Overlapした相手とだけ何かしたい時に使う
(その機能自体を持ってるアクターは他にもいる)
・基本的に1対1
・一応、複数もいける
Get All Actor With Interface系 For~系ノードを使う
・ActorBeginOverlap系でOtherActorを使えば
余計な依存関係が生じない
・そうでなければ、スイッチ(送信元)がドア(送信先)を
取得する必要がある
・クラス関係なく実装できる
本来なら Pawn とかに持たせる ダメージ処理とか を
Pawn じゃない敵もいるんだよ!っていう時 とか
・ActorBeginOverlapなどの不特定多数の相手に使う時に良い
相手がインターフェース実装していなくても次の処理に行くだけなので
・実行されるイベントは個々で決められる
手順
コンテンツブラウザ内で右クリック
ブループリントインターフェース(以下BPI)を作成


BPIを開いて
① リネーム
② 必要であれば変数を作成します
変数はBPI関数内にInputとOutputを作成できます
Inputは入口に作成されるので、関数内を制御する変数が欲しい時
Outputは出口なので、ある値を実行後で使いたい時

変数を設定するとこんな感じになる


送信元BPを開いて
①②③ 右クリ、検索してBPI(メッセージ)を作成
④ イベントノードから繋げる
⑤ 送信先をターゲットに繋げる

この時 変数をActor にしておけば余計な依存関係は生まれません
(画像ではOtherActorをSetしてますが、特定BPアクターでもSetできます)

複数の送信先に送りたい場合は下記の様に組む

送信先BPを開いて
① インターフェース実装
② 赤枠 ダブルクリック or 青枠 クリック
④ BPI実行イベント、ただしInputがある時は関数になるので
他のイベントから繋げる必要あり
⑤ 実行したい処理に繋げる

インターフェースを削除した場合
因みに送信先の実装されているインターフェースを削除すると
自動的にノードがカスタムイベントに変換される

消した場合の対処
① カスタムイベントになる
② Callカスタムイベントを作成するなりする(他にもTimerなど)

ブループリント関数ライブラリ
今まで見てきたのは、ただの合図を送るだけで
相手が複数の場合は処理自体は個々でバラバラに設定していました。
処理を共通にしたい!!
場合は ブループリント関数ライブラリ を使います
手順
コンテンツブラウザで右クリ
ブループリント > ブループリント関数ライブラリ
リネーム

作ったブループリント関数ライブラリを開く
左で関数を作成、リネーム
右でinput outputを設定できる
中央で処理を組む

後は好きなBPを開いて
名前で検索してあげれば出てきます

それぞれの違い
依存関係を確認したい場合
これで確認できる

これはロードする時に子を全て読み込む事を意味する為
左にいるアクターには注意が必要という事になります
