「DefenceAndKnight」開発振り返り記_4
第4回からは開発中期に突入です。今回はプログラム関係多めです。
DefenceAndKnightの敵AIの作成
敵のAIについて
これまではテスト用として簡単なスクリプトは作成していたのですが、ようやく本腰をいれて敵のAI作成に乗り出しました。今回の開発ではステート駆動AIで挙動を作成することにしました。ゲームでは割と利用されるAIなのではないでしょうか?
分かりやすくお伝えするために、UnityのAnimatorで表現します。
以下の画像のようにそれぞれの状態ごとに振舞いを変えるAIですね。
これはどの状態がどういった処理を行うかを分かりやすくできるので、複雑になりがちなAI作成でも管理や修正が容易になるメリットがあります。ただ、むやみやたらに使用するだけだと、冗長化するだけのコードになってしまうデメリットもあるので、使いどころに気を付ける必要がありますね。
敵のAI実装
これまでは、プレイヤーがどんな距離にいても問答無用で攻撃してきていたのですが、一定距離内に入るまでは発見しなくなりました。また、敵に発見されても索敵範囲外に行ってしまえば、見失うなどの機能を追加することでようやく敵らしくなってきます。
待機状態、索敵状態、発見状態、攻撃状態など状態を作成して、それぞれに応じて行動させるようにするのは比較的簡単でした。敵のAI作成って楽しいね!
そんな思いを簡単に吹き飛ばしてしまうのがバグ!
アニメーション処理とAIの振舞いがずれてしまうバグが発生しました。最初は良いものの、どんどんアニメーションと攻撃処理がずれていきました。最終的には、敵が予備動作なしの「不可避の理不尽攻撃」を放ってきます。
バグ確認タイム
まずはどこがずれを起こす原因なのかの調査から始めます。状態ごとのアニメーションと振舞いを1つ1つ確認していくことから始め、原因らしき場所を発見したら検証、再度確認...。
アニメーションの開始、終了を判定する機能を使いながら検証を進めていると、一番の原因を見つけました。アニメーションブレンド君!?
Unityにはアニメーションをブレンドして、滑らかにアニメーション遷移させる機能があるのですが、それを使用した影響で遷移の際にアニメーションのずれが起こっていました。(゜_゜)
いやはや、どうにか原因を見つけられたものの、発見まで骨の折れる作業でした。
バグ修正タイム
しかし、まだ発見しただけなんです。これから修正しなければならない!!
適切にアニメーションされているかどうか、コールバックや非同期処理が状態と合致しているかどうかをクリプトとにらめっこしながら、進めていきました。
頭が過熱するのを感じながら、修正できた時の達成感はすごくいい!!
流用できそうな部分はしっかり作っておくべき!
今回の敵の根幹システムをかなり綿密に作成しました。その思惑通り、新しい敵を追加するときでも、AIシステムは流用が効き、比較的楽でした。
今後の開発でも汎用性があるシステムをガンガン設計していきたいですね~。
ということでここまで読んでいただきありがとうございました。