ゲーム開発備忘録

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

【UE4・UE5】Unity勢&入門者向け!ブループリントの作成と対象の情報を取得する。~③特定の条件で取得する編~

はじめに

~②自動で取得する編~の続きです。

まだ読んでいない場合はこちらからご覧ください。

 

前回はゲームを実行したときにマップ上の目的のクラスを検索して、

情報を取得するやり方を解説しました。

 

ですがこの方法だと100個のアイテムがマップ上にあった場合、

100個分の情報をプレイヤーブループリントが持っている(参照を持つといいます)ことになるのでゲームがとても重くなります。

 

例えば一時期流行したバトルロワイヤルゲームだと、

プレイヤーがマップ上の100人分の情報と300個の落ちているアイテムの情報を常に持つのは、負荷がかかり最悪ゲームがクラッシュします。

 

 

そこで特定の条件(今回は対象を見た)ときに対象のみの情報を取得できるように実装していこうと思います。

namiton.hatenablog.jp

やりかた

⓪事前準備

前回使用した開始時にセットする動作は利用しないので切断しておきます。

範囲選択してショートカットのCキーを押すとコメントがつけられるので、

見返したときにわかるようにコメントをつけておきましょう。

f:id:namiton:20220208151747p:plain

 

①ライントレースを使いこなそう

UnityでおなじみレイキャストはUE4でライントレースという機能に相当します。

ライントレースはある一定の場所まで線を伸ばし、

その間に当たったものを返す便利な機能です。

 

UE4には複数のアクターを返すMultiLineTrace

初めに当たったものだけを返すLineTraceがありますので

やりたい実装に合わせたノードを使用しましょう。

 

今回は見ているアクターのみを返してほしいのでLineTraceを使用します。

f:id:namiton:20220208143319p:plain

FirstPersonCharacterを開き以下のように組んでみましょう。

f:id:namiton:20220208150443p:plain

これはカメラから見ている前方向に距離1000先まで線を出す組み方です。

 

このイベントをキー入力でデバックしてみましょう。

任意のキーイベントを作成し、イベントを呼び出します。

f:id:namiton:20220208150728p:plain

 

プレイすると、このように見ている場所に線が表示されます。

f:id:namiton:20220208150842p:plain

 

②当たったオブジェクトから情報を取得しよう

 

当たった情報はOutHitという構造体から確認できます。

構造体を分解して、、

f:id:namiton:20220208151125p:plain

 

当たったアクターが存在するかどうかチェックしましょう。

f:id:namiton:20220208151255p:plain

 

キャストノードを使ってみましょう。

キャストは入力したアクターがCube_Blueprintかどうか判断してくれるノードです。

大変便利なノードですがハード参照になるので使いすぎには注意です。

 

当たったアクターがCube_Blueprintなら変数に入れ、

そうでない場合は変数を空にするという処理となっています。

f:id:namiton:20220208152015p:plain

第一回で作成した情報を取得する関数を確認します。

f:id:namiton:20220208152805p:plain

 

チェックする動作と、情報を表示する動作はまとめたほうが使いやすいので

キー入力を削除して関数を呼び出すようにしましょう。

f:id:namiton:20220208153037p:plain

 

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

Cube_Blueprintに向かってキーを押すと

情報が表示されるはずです。

f:id:namiton:20220208153356p:plain


③エラーに強いノードにしよう

先ほど呼び出したGetTargetActorInformationですが

もし誤って画像のようにつなげてしまったらどうなるでしょうか?

f:id:namiton:20220208153643p:plain

 

実行して何もない場所でキーを押すと

以下のようなエラーが出てしまします。

f:id:namiton:20220208153738p:plain

これはUnityでよくみる

NullReferenceException

と同じエラー内容です。

TargetActorの変数が空っぽなのに
GetTargetActorInformationでその変数から情報を取得しようとしているからです。

 

お米がないのにお米を炊こうとしてもごはんはできないですよね!!(伝われ)

 

あくまで個人的な思想ですが、

関数やカスタムイベントを作成するときに

内部で使用する変数は入力として扱うと分かりやすいです。

また呼び出し側ではなく使用するところでその変数が使えるかどうか

チェックしてあげると、デバックがしやすいと思います。

 

まず変数を入力として扱ってみましょう。

GetTargetActorInformationもイベントにCubeBlueprintの変数を作成します。

f:id:namiton:20220208154649p:plain

 

使用するところ(GetTargetActorInformation)で変数が使えるかチェックします。

また使えないときは【対象がいないね】と言ってあげましょう。

f:id:namiton:20220208154911p:plain

イベント使用時に変数が入力ピンとして出るので

なんの変数を使用しているかすぐわかりますね。

また、このような書き方ならTargetActorの変数がなくても実装できますね。

f:id:namiton:20220208155439p:plain

 

そして、もし対象がいないのにイベントをよんでしまっていても

対象がいないね、、と教えてくれてエラー扱いにはなりません。

f:id:namiton:20220208155542p:plain

確認出来たら下のイベントは消しちゃいましょう。

f:id:namiton:20220208155758p:plain

最後にCube_Blueprintをマップ複数置いて

詳細から名前や年齢などを変えて実行してみましょう。

f:id:namiton:20220208160054p:plain

 

それぞれ異なった情報が出力されたら成功です!

f:id:namiton:20220208160214p:plain

 

さいごに

これでUnity勢&入門者向け!ブループリントの作成と対象の情報を取得するシリーズは終わりです。お疲れ様でした!!

キャストノードは便利ですが負荷が発生しやすいポイントでもあります。

マネージャーやプレイヤーブループリントなどで

キャストを大量に行うことはやめましょう。

 

回避策としてインターフェースを解説した記事を書いていますので

そちらもぜひ挑戦してみてくださいね!

また、アイテム名を出す記事では今回解説できなかったUI表示も解説しているので要チェックです。

namiton.hatenablog.jp

 

 

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

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

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

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