はじめに
~②自動で取得する編~の続きです。
まだ読んでいない場合はこちらからご覧ください。
前回はゲームを実行したときにマップ上の目的のクラスを検索して、
情報を取得するやり方を解説しました。
ですがこの方法だと100個のアイテムがマップ上にあった場合、
100個分の情報をプレイヤーブループリントが持っている(参照を持つといいます)ことになるのでゲームがとても重くなります。
例えば一時期流行したバトルロワイヤルゲームだと、
プレイヤーがマップ上の100人分の情報と300個の落ちているアイテムの情報を常に持つのは、負荷がかかり最悪ゲームがクラッシュします。
そこで特定の条件(今回は対象を見た)ときに対象のみの情報を取得できるように実装していこうと思います。
やりかた
⓪事前準備
前回使用した開始時にセットする動作は利用しないので切断しておきます。
範囲選択してショートカットのCキーを押すとコメントがつけられるので、
見返したときにわかるようにコメントをつけておきましょう。
①ライントレースを使いこなそう
UnityでおなじみレイキャストはUE4でライントレースという機能に相当します。
ライントレースはある一定の場所まで線を伸ばし、
その間に当たったものを返す便利な機能です。
UE4には複数のアクターを返すMultiLineTraceと
初めに当たったものだけを返すLineTraceがありますので
やりたい実装に合わせたノードを使用しましょう。
今回は見ているアクターのみを返してほしいのでLineTraceを使用します。
FirstPersonCharacterを開き以下のように組んでみましょう。
これはカメラから見ている前方向に距離1000先まで線を出す組み方です。
このイベントをキー入力でデバックしてみましょう。
任意のキーイベントを作成し、イベントを呼び出します。
プレイすると、このように見ている場所に線が表示されます。
②当たったオブジェクトから情報を取得しよう
当たった情報はOutHitという構造体から確認できます。
構造体を分解して、、
当たったアクターが存在するかどうかチェックしましょう。
キャストノードを使ってみましょう。
キャストは入力したアクターがCube_Blueprintかどうか判断してくれるノードです。
大変便利なノードですがハード参照になるので使いすぎには注意です。
当たったアクターがCube_Blueprintなら変数に入れ、
そうでない場合は変数を空にするという処理となっています。
第一回で作成した情報を取得する関数を確認します。
チェックする動作と、情報を表示する動作はまとめたほうが使いやすいので
キー入力を削除して関数を呼び出すようにしましょう。
実行して確認してみましょう。
Cube_Blueprintに向かってキーを押すと
情報が表示されるはずです。
③エラーに強いノードにしよう
先ほど呼び出したGetTargetActorInformationですが
もし誤って画像のようにつなげてしまったらどうなるでしょうか?
実行して何もない場所でキーを押すと
以下のようなエラーが出てしまします。
これはUnityでよくみる
NullReferenceException
と同じエラー内容です。
TargetActorの変数が空っぽなのに
GetTargetActorInformationでその変数から情報を取得しようとしているからです。
お米がないのにお米を炊こうとしてもごはんはできないですよね!!(伝われ)
あくまで個人的な思想ですが、
関数やカスタムイベントを作成するときに
内部で使用する変数は入力として扱うと分かりやすいです。
また呼び出し側ではなく使用するところでその変数が使えるかどうか
チェックしてあげると、デバックがしやすいと思います。
まず変数を入力として扱ってみましょう。
GetTargetActorInformationもイベントにCubeBlueprintの変数を作成します。
使用するところ(GetTargetActorInformation)で変数が使えるかチェックします。
また使えないときは【対象がいないね】と言ってあげましょう。
イベント使用時に変数が入力ピンとして出るので
なんの変数を使用しているかすぐわかりますね。
また、このような書き方ならTargetActorの変数がなくても実装できますね。
そして、もし対象がいないのにイベントをよんでしまっていても
対象がいないね、、と教えてくれてエラー扱いにはなりません。
確認出来たら下のイベントは消しちゃいましょう。
最後にCube_Blueprintをマップ複数置いて
詳細から名前や年齢などを変えて実行してみましょう。
それぞれ異なった情報が出力されたら成功です!
さいごに
これでUnity勢&入門者向け!ブループリントの作成と対象の情報を取得するシリーズは終わりです。お疲れ様でした!!
キャストノードは便利ですが負荷が発生しやすいポイントでもあります。
マネージャーやプレイヤーブループリントなどで
キャストを大量に行うことはやめましょう。
回避策としてインターフェースを解説した記事を書いていますので
そちらもぜひ挑戦してみてくださいね!
また、アイテム名を出す記事では今回解説できなかったUI表示も解説しているので要チェックです。
UE4やUE5向けの記事を書いています。
皆様の応援が投稿のモチベーションになりますので
コメントやTwitterのフォローなどしていただけるとありがたいです。
それではよきゲーム開発を。