キャラクターの命令実行処理について(2)
複数のステート間の移行
前記事ではユニットに与えられた命令を処理するために、複数のステートを適宜切り替える必要があることを説明しました。 この一連のステート間の移行をどう管理すべきでしょうか?
キュー(FIFO)で管理する
命令を入力したときに必要なステートをキューに格納することで管理する方法です。 例:攻撃コマンドを実行した場合、移動ステート・攻撃ステートの順にキューに格納します。 最初に格納されたものから処理されるので移動ステート・攻撃ステートの順に処理されます。 また、キューが空になったら待機ステートが設定されるようにしておきます。
スタック(LIFO)で管理する
命令を入力したときに必要なステートをスタックに格納することで管理する方法です。 例:攻撃コマンドを実行した場合、攻撃ステート、移動ステートの順にスタックに格納します。 最後に格納されたものから処理されるので移動ステート・攻撃ステートの順に処理されます。 また、スタックの底には待機ステートが常に格納されるようにしておきます。
何が違うのか
両者にはそれぞれ異なるメリットがあります。 キュー管理型のメリットは複数命令の順次実行に対応できる点です。 作業ユニットに複数の作業を順に実行させたい場合(PCゲームであればCtrl+クリックなどで入力させる)、キューに移動ステート、作業ステート、移動ステート、作業ステート・・・の順に格納することで実現できます。 運営や管理に主眼を置いたストラテジーゲーム向けの仕様だと思います。 一方スタック管理型のメリットは割り込み命令に対応できる点です。 戦闘ユニットが目標に向かう途中で敵の迎撃を受けた場合、スタックに新たに攻撃ステートを積むことで敵ユニットへの攻撃を開始、敵ユニットを壊滅させたらそのまま元の目標への移動を再開、という流れをプレイヤーの追加入力なしに実現できます。 こちらは戦闘や戦略に主眼を置いたストラテジーゲーム向けの仕様になります。
複合型
ユニットデータにキューとスタックの両方を持たせることも可能です。 命令が複数入力された場合最初の命令だけスタックに、以降の命令はキューに格納しておき、スタックの命令が終了したら(=待機ステートになったら)キューから次の命令を取り出してスタックに積むという形になります。 このようにすれば両者の利点が利用できますが、実際のところここまで実装しているゲームはあまり見かけません。 複雑なルールにするとプレイヤーにも理解しづらく混乱を招くのかもしれません。 ゲームの仕様に応じてキュー管理型かスタック管理型かを選ぶのがよいと思います。