Skip to main content

01.キャラクターAI・FSM

これまでの授業で扱ったゲームAIの考え方・状態管理・探索を、ゲーム内での使い方と結び付けながら振り返ろう!

このワークでは、長いプログラムを暗記することよりも、何を判断したいのか → どの仕組みを使うのか → その結果どんな行動につながるのかを確認します。

1.キャラクターAIの基本

キャラクターAIと視界判定の板書

ゲームのキャラクターAIは、周囲の情報を受け取り、その情報をもとに状態や行動を決めます。授業では、センサ → 判断 → 行動という流れで考えました。

Q01.AIの処理の流れを並べよう

次の処理を、キャラクターAIが行う基本的な順番に並べてください。

  • A.行動する
  • B.周囲の情報を調べる
  • C.どう行動するか判断する

答え:__ → __ → __

答え

B → C → A

まずセンサなどで状況を調べ、その結果から行動を決め、実際の移動や攻撃につなげます。

Q02.視界判定に必要な情報を選ぼう

敵キャラクターが「プレイヤーが視界に入っているか」を判定します。敵の位置を $P_e$、プレイヤーの位置を $P_p$、敵の前方向を $F$ とします。

判定に必要な情報として適切なものをすべて選んでください。

  • A.$P_p-P_e$ から求める、敵からプレイヤーへの方向
  • B.敵からプレイヤーまでの距離
  • C.敵の前方向 $F$
  • D.視野角の基準
  • E.プレイヤーの描画ポリゴン数
答え

A・B・C・D

距離で索敵範囲内かを確認し、敵の前方向とプレイヤー方向の角度関係から視野内かを判定できます。

Q03.距離判定を先にする理由は?

索敵距離が10mの敵に対し、プレイヤーが100m先にいることが分かりました。このとき視野角の計算を省略できる理由を選んでください。

  • A.距離だけで「見えていない」と判断できるため
  • B.内積は10mより遠いと計算できないため
  • C.視野角は距離によって必ず0度になるため
  • D.100m先ではベクトルを作れないため
答え

A

先に簡単な条件で除外できれば、その後の計算を省けます。

Q04.内積を使って視野内か判定しよう

敵の前方向 $F$ と、敵からプレイヤーへの単位方向 $D$ の内積が $F\cdot D=0.8$ でした。

敵の視野を「前方向から左右45度以内」とし、$\cos45^\circ\approx0.707$ とします。プレイヤーは視野内でしょうか。

  • A.視野内。$0.8\ge0.707$ だから
  • B.視野外。$0.8\ge0.707$ だから
  • C.視野内。内積が0より大きければ角度に関係なく必ず見えるから
  • D.内積では前方向との角度関係を判断できない
答え

A

単位ベクトル同士なら $F\cdot D=\cos\theta$ です。視野の半角が45度なら、$F\cdot D\ge\cos45^\circ$ を満たすかで判定できます。

Q05.内積の値と位置関係を対応させよう

敵の前方向 $F$ とプレイヤー方向 $D$ は、どちらも単位ベクトルとします。次の内積の値と、おおよその位置関係を対応させてください。

内積 位置関係
$F\cdot D\approx0.95$ ______
$F\cdot D\approx0$ ______
$F\cdot D\approx-0.8$ ______

選択肢:ほぼ正面・ほぼ真横・後方

答え
  • $0.95$ → ほぼ正面
  • $0$ → ほぼ真横
  • $-0.8$ → 後方

内積の値を「方向の近さ」と結び付けて理解しましょう。

Q06.フラグだけで管理するとどうなる?

isFound、isAttack、isDamaged のようなフラグを大量に増やして行動を管理したときに起こりやすい問題を選んでください。

  • A.条件の組み合わせが増え、処理の流れが分かりにくくなる
  • B.どんな場合でも処理が高速になる
  • C.状態遷移が不要になる
  • D.必ずメモリ使用量が0になる
答え

A

行動の種類が増えると「どのフラグの組み合わせが、どの行動なのか」が複雑になりやすくなります。


2.FSM(有限状態機械)で行動を整理しよう

FSMと状態遷移の板書

FSMでは、キャラクターが現在どの**状態(State)にいるかを決め、条件を満たしたときに別の状態へ遷移(Transition)**させます。

たとえば、敵AIなら 待機 → 追跡 → 攻撃 のように行動を状態として分けられます。

Q07.FSMの用語を対応させよう

用語 説明
State ______
Transition ______
Condition ______

選択肢:現在の行動状態・状態を切り替えること・状態を切り替えるための条件

答え
  • State → 現在の行動状態
  • Transition → 状態を切り替えること
  • Condition → 状態を切り替えるための条件

Q08.状態遷移を追って最終状態を求めよう

敵AIに次の遷移を設定しました。

  • Idle でプレイヤーを発見 → Chase
  • Chase で攻撃範囲に入る → Attack
  • Attack で攻撃範囲から出る → Chase
  • Chase でプレイヤーを見失う → Idle

敵が Idle から開始し、発見 → 攻撃範囲に入る → 攻撃範囲から出る → 見失う の順に状況が変化しました。最終状態を選んでください。

  • A.Idle
  • B.Chase
  • C.Attack
  • D.遷移できない
答え

A.Idle

Idle → Chase → Attack → Chase → Idle と遷移します。

Q09.複数の遷移条件が同時に成立したら?

Chase から次の2つの遷移があるとします。

  • 攻撃範囲に入った → Attack
  • プレイヤーを見失った → Idle

実装上、同じフレームで両方の条件が成立する可能性がある場合、設計として必要なものを選んでください。

  • A.遷移の優先順位を決める、または条件が重ならないようにする
  • B.2つのStateを同時に現在状態にする
  • C.遷移条件をすべて削除する
  • D.毎回ランダムに遷移先を選ぶ
答え

A

FSMでは、条件が重なったときにどの遷移を採用するかも設計の一部です。

Q10.状態遷移表を読もう

次のルールで敵を動かします。

現在の状態 条件 次の状態
Idle プレイヤーを発見 Chase
Chase 攻撃範囲に入った Attack
Chase プレイヤーを見失った Idle
Attack 攻撃範囲から出た Chase

敵が Chase 中で、プレイヤーが攻撃範囲に入りました。次の状態は何ですか。

答え:______

答え

Attack

Q11.switch 実装の落とし穴を見つけよう

次のコードでは State::Chase の break を書き忘れています。

switch (state)
{
case State::Idle:
    UpdateIdle();
    break;
case State::Chase:
    UpdateChase();
case State::Attack:
    UpdateAttack();
    break;
}

state == State::Chase のとき、何が起こりますか。

  • A.UpdateChase() の後に UpdateAttack() も実行される
  • B.UpdateIdle() だけ実行される
  • C.コンパイラが自動的に break を補う
  • D.state が自動的に Attack に変わる
答え

A

break がないため次の case へ処理が流れるフォールスルーが起きます。

Q12.FSMが複雑になりやすいのはどんなとき?

FSMの弱点として適切なものを選んでください。

  • A.状態や遷移が増えると、関係が複雑になりやすい
  • B.状態を1つしか作れない
  • C.条件分岐を一切使えない
  • D.ゲームAIには利用できない
答え

A

FSMは分かりやすい一方、状態数や遷移数が増えると状態遷移図や条件管理が複雑になります。

Q13.Stateと遷移条件を分けて考えよう

次の項目を、**State(状態)とCondition(遷移条件)**に分類してください。

項目 State / Condition
待機している ______
プレイヤーとの距離が2m未満 ______
追跡している ______
HPが0以下になった ______
攻撃している ______
プレイヤーを見失った ______
答え
  • 待機・追跡・攻撃 → State
  • 距離が2m未満・HPが0以下・見失った → Condition

「今何をしているか」がState、「いつ切り替えるか」がCondition と考えると整理しやすくなります。

Q14.FSMの設計として自然なものを選ぼう

次の敵AIをFSMで作ります。

普段は巡回する。プレイヤーを発見したら追跡する。近づいたら攻撃する。見失ったら巡回へ戻る。

最も自然な設計を選んでください。

  • A.Patrol、Chase、Attack をStateにし、発見・距離・見失いをConditionにする
  • B.発見・距離・見失いをStateにし、巡回・追跡・攻撃をConditionにする
  • C.巡回・追跡・攻撃を毎フレームすべて同時に実行する
  • D.Attack だけをStateにし、それ以外は描画処理で決める
答え

A

継続する行動をState、切り替えのきっかけをConditionとして整理します。