ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【ゼロからアンリアルエンジン5】 ⑩アクタ間での情報のやり取り

目次

 

はじめに

注意

UE5Preview2の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

Preview2になりReal型が従来のfloatに戻りました。

バージョンアップ時に自動的に置き換わるので問題ないですが、

従来の記事ではfloatに置き換えて実装してください。

 

 

親や先生に勉強をしろと言われて、子供がしぶしぶ勉強する構図はたいていの人が体験したことだとおもいます。今回はアクタを2つ用意して命令する側(BP_Transmitter)が命令される側(BP_Receiver)を制御するブループリントを作成します。

解説

①新規ブループリントの作成

前回のプロジェクトから、BP_Receiverのブループリントを複製します。

 

コンテンツブラウザからBP_Receiverを選択し、Ctrl+D

名前をBP_Transmitterに変更します。

この2つを使って

BP_Receiverは情報の受け取り

BP_Transmitterは情報の送信を行います。

f:id:namiton:20220309120322p:plain


②BP_Transmitterの改造

まずは見た目を変えましょう。

BP_Transmitterを開き、StaticMeshをCylinderに変更します。

f:id:namiton:20220309120630p:plain

またこのブループリントの変数と関数、イベントグラフ上のノードのイベント(赤いノード)以外を削除します。

コンパイルもしておきましょう。

f:id:namiton:20220309120816p:plain

 

③BP_Receiverの改造

このブループリントではBP_Transmitterから受け取った情報をもとに指定時間移動するという処理を記述します。

関数内では時間系のノードを利用できないのでイベントグラフに新規イベントとして作成します。

 

何もないところで右クリックし t. と検索します。

するとカスタムイベントを追加....という項目があるのでクリックしましょう。

名前をMoveEventとします。

f:id:namiton:20220309121225p:plain

カスタムイベントはBeginPlayやTickと同じようにイベントノードなので赤い色をしています。このノードを呼ぶことでピンから実行処理が走ります。

f:id:namiton:20220309121432p:plain

移動するには移動する時間とベクトルが必要なので

カスタムイベント内のインプットに作成します。

f:id:namiton:20220309121813p:plain

今回はGateノードを使用します。

以下のようにノードを組みましょう。

f:id:namiton:20220309122109p:plain

 

Sequenceノード実行ピンを分割する。

Then 0 1 2....の順番で実行される。

f:id:namiton:20220309122246p:plain

 

Gateノード

信号を流すかどうかを実行ピンのみで行うノード

基本的にはEnterに流れる入力信号をExitに流す。

OpenだとExitに流れるが

Closeだと流れない。

f:id:namiton:20220309122557p:plain

 

組み終わったらこのイベントを使用してみましょう。

BeginPlayのノードを切断して作成したノードにつなげます。

時間とベクトルを入力するとその通りに実行されるはずです。

f:id:namiton:20220309122838p:plain

確認出来たらBeginPlayはなにも接続しないようにします。

f:id:namiton:20220309123058p:plain

 

④BP_TransmitterからBP_Receiverを制御する

本日の本題です。

異なるアクタ間でイベントや変数をやりとりすることでお互いに制御することができます。

BP_ReceiverはBeginPlayから切断したので単体では移動することができません。

しかし移動するというイベントを外部から呼べば動くことができるはずです。

実際にやってみましょう。

BP_Transmitterを開きます。

以下のようにノードを組みましょう。

f:id:namiton:20220309123814p:plain

※注意※ActorClassの設定を忘れないようにしましょう

 

GetAllActorsOfClass

レベル上(アウトライナー)のActorClassと同じアクタをすべて取得し、アクタの参照を配列(同じ変数のまとまり)に出力します。

f:id:namiton:20220309124045p:plain

 

is Vaild

InputObjectに流れたものが存在するかをチェックします。

存在する場合は上のピンない場合は下に流れます。

f:id:namiton:20220309124213p:plain

 

コンパイル後レベルに戻り、BP_Transmitterをレベル上に配置します。

実行して確認してみましょう。

BP_TransmitterがBP_Receiverのイベントを呼び出したことで移動していたら成功です。

f:id:namiton:20220309124352p:plain

BP_Transmitterがレベル上にいるBP_Receiverを取得することを参照を持つといいます。

BP_Receiverの参照をもったBP_Transmitterは特殊なケースを除きすべての変数やイベントを呼び出すことができます。

今回は命令される側の移動イベントに変数を入れるようにしましたが、

前回と同じようにあらかじめTickで移動させておいてAddVelocityの内容を上書きすることで移動量を制御することも可能ですが、その辺りは作成するゲームの設計にあった手法を取りましょう。

f:id:namiton:20220309125300p:plain

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。