UE5オクトラ風ゲーム制作記 24/2/16「行動順とDelayについて 」 (動画もあるよ)
はじめに
前日のはこちら
最初のはこちら
目に見える形にならないのは難しい
前回の記事からまた日が空いてしまいました。
今回は「敵とプレイヤーに速度のステータスを追加」「速度に応じた行動順」「ダメージの演出」を主に仮実装していました。
しかしまあこれらはブループリントを弄っている時間が長くて、なかなか目に見える形にできなかったものです。
つべこべ言わずに見たほうが早いので動画のリンクを置いておきます。
(いちおう限定公開なので…)
(敵が同時に動いているのは今のところ仕様です)
(敵二人目のほうにはまだ処理を実装していないので止まります)
(ちなみに形にしただけで、処理はガバガバなので絶賛修正中です)
スパゲッティコードになった!
ここで行動順をどうのこうのしているのですが、ブループリントでつないでる内に複雑なコードになってしまいました。
今は自分一人で作っているのでいいですが(良くない)
デバッグや修正のことも考えるとこのまま進むわけにはいきません。
いちおう、ブループリントには、複数のノードを関数やマクロとしてまとめてくれる機能があるので、それを使っていこうかな…
行動順の決定
速度による行動順の決定自体は、上記のコードで完結しています。
全キャラクターの速度を配列を
指定の順番(名前のリストと同じ順番)で格納し、
速度の中の最大値のindexを取得して、名前と速度をセットでマップに格納します。
その後、元の配列2つから、最大値のindexを削除します。
これをForEachLoopでループさせています。
しかしまあここで1つミス?抜け穴?があります。
それは、速度の値が同じ値だった場合、名前の上から順番に格納されてしまうという点です。
もっと単純に言うと、同速の場合、ランダムではなく決められた順番になってしまいます。
まあ…めんどくさいから後回しでいっか!ていうか極論仕様でもいっか!
がはは!!!
行動順の反映
上記で決めた行動順通りに、実際に行動させる必要があります。
これは過去のコードで、今はloopを使ってなかったり、後の処理が違っていたりするのですが、原理を説明する分にはもうまんたいなので、このまま書いていきます。
というわけで、まずは、各敵が存在しているかどうか(または死亡しているかどうか)で判断し、いないならば先ほど作成したマップから対象の情報をREMOVE(消去)します。
その後、マップから名前を参照し、その名前の対象に行動を実行させます。
そうして全員が行動したら、またコマンド選択へ戻ります。
ガバガバというか今後のはなし
敵もプレイヤーも、とりあえずはダメージを受けたら次のキャラの行動に移るようになっている。今後は回復やバフなどのダメージを伴わない行動も追加するので、これを修正しないとゲームが止まってしまう。
2体目以降の敵にはまだ処理をほとんど実装していないので、ちゃんと行動してくれるかわかんない。
ダメージ計算はまだ実装していないから、実は固定ダメージになってる
なんか速度っている?って思ってきた。
プレイアブルキャラは今のとこ1人だけど、複数人でパーティ組ませることになったらどうしよう。
Delayノードの勘違い
UEには「Delay」ノードがあります。
これは指定した秒数だけ遅らせて実行するといったものです。
例えば、1秒を指定してこのコードを実行すると…
1秒後に…
Helloという文字が…
出ません!!!!!!!!!!
なんでやねーん!
まあ、あくまで「自分はこう理解した」という前提で話すと、
コードの実行時には、Delayノードの後ろのノードも読み込まれているため
特に意味のないDelayとPrintが同時に発生しているものと考えています。
正しい?使い方
というわけで、Delayノードをうまく使うためには、
イベント通知がいいんじゃないかと思い、コードを組んでみました。
このコードを実際に実行すると、
3秒後にAct1に含まれる処理が実行されました。
いやまあ、だからなんだという話ではあるのですが、
もしこれを奇跡的に目にしているあなたや私が、いつかDelayノードを使うのであれば、頭の片隅にいれておいて損はないよ!!!!
ということです。
さいごに
久々の更新ですが、次の更新もまた長くなりそうです。
け、けっしてさぼってるわけじゃないんだからね!!!
(とても私事ですが、最近「物語」シリーズをアマプラで見終えました。あとは傷物語だけなんだけど、はやくアマプラにこないかな~)
さて、とりあえずはスパゲッティコードをどうにかするとしますか…
もしこんな備忘録を読んでいる方がいるのならば、今回もここまで読んでいただきありがとうございます。
この記事が気に入ったらサポートをしてみませんか?