キャラクターの命令実行処理について(1)

キャラクターに与えられた命令を実行させるには

ゲーム内のキャラクターに何らかの行動をさせるために必要な処理はゲームジャンルによって大きく異なります。
アクションゲームであればプレイヤーの入力に応じた動作を即時反映させるだけなのでシンプルですが、そのようなゲームばかりではありません。
この記事ではストラテジーゲームなどに多く見られるような、 「プレイヤーがキャラクターに命令を入力し、キャラクターはその命令に応じた行動を自動で実行する」という一連の処理を実装する上での基本的な考え方を説明します。

用語について

この記事では各キャラクターのことをユニットと呼びます。
プレイヤーキャラ(PC)も非プレイヤーキャラ(NPC)も同じユニットとして扱うことで処理を共通化します。
また、ユニットが何の命令を実行中かを示す状態をステートと呼びます。
各ユニットがそれぞれステートを持ち、毎フレームの処理によってユニットがそのステートに応じた行動を実行します。
PCはプレイヤーによって、 NPCはゲームのアルゴリズムによって命令を与えられることになりますが、 NPCの命令アルゴリズムについてはゲームの仕様に大きく左右されるので記事としてはフォローしません。

待機ステートについて

待機ステートは最も基本的ステートです。
何も命令が与えられていないユニットはこのステートになります。
また、何らかの命令が与えられたユニットも命令に応じた行動が終了したらこのステートに戻ります。
毎フレームの処理ではユニットは何もせずに終了します。

移動ステートについて

ユニットに移動命令が与えられると移動ステートに移行します。
移動ステートは目標を持っており、命令として与えられた目標が格納されます。特定の地点や建造物や他のユニットが目標になり得ます。
毎フレームの処理ではまずユニットが目標に到着しているかどうかを判定します。
到着していなければユニットの移動力に応じて座標移動をさせ、 到着していれば移動ステートを終了して待機ステートに移行します。

移動ステートの経路探索について

ユニットが存在するのが何も障害物のない均一な世界であれば、目標に向けてただ直線移動させればいいのですが、そのようなゲームを作る機会は多くないでしょう。
障害のあるワールド上でユニットを移動させるためには経路探索処理を実装しなければなりません。
経路探索について詳しく知りたければ、A*(エースター)アルゴリズムについて調べるといいと思います。
ユニットの目標が動くオブジェクト(他のユニットなど)の場合、経路探索は適宜更新をしなければなりませんが、 毎フレーム探索すると処理不可が大きいので数フレーム置きに間引いた方がよいと思います。
目標が動かない場合(地点や建造物など)は経路探索は命令入力直後の一回だけで済みます。
いずれの場合も探索した経路は移動ステートから参照できる形で保持させます。

その他の行動ステート

ここからはゲームの仕様次第なのですが、 例えば軍事ユニットであれば敵ユニットに攻撃する、敵の建造物を破壊するなどの命令が、 作業ユニットであれば採掘地点で資源を得る、建造物を建てる等の命令が必要になるはずです。
それぞれの命令に対応した行動ステートを実装します。
攻撃命令であれば攻撃ステートを実装し、このステートには目標として敵ユニットを持たせるようにします。
破壊命令であれば破壊ステートを実装し、このステートには目標をとして敵建造物を持たせるようにします。
毎フレーム処理ではまず各行動が終わったかどうかを判定します。
攻撃ステートの場合目標ユニットが壊滅したかどうか、破壊ステートで場合目標ユニットが破壊されたかどうかです。
終わっていればそのステートを終了して待機ステートに移行します。
終わっていなければ各ステートに応じた行動を実行させます。

ステートの移行について

これらの命令を入力した際にユニットが既に各目標に隣接していればよいですが、 そうでなければユニットを目標の場所に移動させてから各行動を実行させます。
命令を与えられたユニットはまず移動ステートが設定されることで目標への移動を開始し、目標に到達したら対応した行動ステートに移行します。
こうすることでプレイヤーが移動→各行動という命令を適宜入力することなく、一度の命令入力でユニットに一連の行動をさせることができます。

次の記事ではこの流れを実装するための考え方を説明します。