敵キャラのAI設計で使える簡単な状態遷移モデル(FSM)とは?
「敵キャラに動きをつけたいけど、どうやって実装すればいいかわからない」
そんな初心者におすすめなのが、状態遷移モデル(Finite State Machine:FSM)を使ったAI設計です。
FSMはシンプルで分かりやすく、個人開発でも取り入れやすい方法のひとつ。
この記事では、FSMの基礎と、ゲームAIへの具体的な活用例を紹介します。
目次
FSM(有限状態機械)とは?
FSMとは、ある「状態(State)」に応じて異なる処理を行い、条件に応じて次の状態に移るという仕組みです。
簡単に言えば、「今、何をしているか」を明確に管理する方法です。
ゲームにおけるFSMの基本構造
例えば敵キャラが以下のような行動を取るとします:
- プレイヤーを探す(巡回)
- プレイヤーを見つけたら追いかける
- 一定距離に近づいたら攻撃する
- ダメージを受けたら怯む
- HPが0になったら倒れる
これらを状態として定義し、それぞれの**条件(トリガー)**で状態を遷移させます。
状態と遷移の例(簡易版)
状態 | 次の状態への条件 |
---|---|
巡回(Patrol) | プレイヤーを視認したら → 追跡へ |
追跡(Chase) | プレイヤーに近づいたら → 攻撃へ |
攻撃(Attack) | 攻撃後 → 再び追跡へ or 巡回へ |
怯み(Stagger) | 一定時間経過 → 元の状態へ戻る |
倒れる(Dead) | HPが0以下 → 状態固定(終了) |
実装イメージ(擬似コード)
pythonコピーする編集するif state == "Patrol":
move_along_route()
if can_see_player():
state = "Chase"
elif state == "Chase":
chase_player()
if is_close_to_player():
state = "Attack"
elif lost_sight_of_player():
state = "Patrol"
elif state == "Attack":
perform_attack()
if attack_finished():
state = "Chase"
elif state == "Stagger":
if stagger_timer <= 0:
state = "Chase"
elif state == "Dead":
stop_all_actions()
このように、状態ごとの処理を明確に分けることで、動きが理解しやすく、バグも出にくくなります。
FSMを使うメリット
- 状態ごとに処理を整理できるため、コードが見やすくなる
- 条件が明確なので、デバッグや調整がしやすい
- キャラごとに異なるAIを簡単に作り分けられる
- 状態管理が明快なので、新しい動作の追加がしやすい
よくあるパターンと応用
タレット型(その場で攻撃)
- Idle → Detect → Shoot → Cooldown → Idle
近接型(近づいて殴る)
- Patrol → Chase → Attack → Chase
遠距離型(距離を取りながら攻撃)
- Patrol → Chase → Attack → Retreat → Chase
このように、FSMを応用すればさまざまな行動パターンが作れます。
FSM設計時の注意点
- 状態が増えすぎると逆に複雑になる → グループ化やサブFSMを活用
- 条件があいまいだと意図しない挙動に → トリガーの判定は明確に
- 状態の“途中”で他の状態に移る場合の中断処理を忘れずに
まとめ:FSMは「シンプルで強力なAI設計ツール」
ポイント | 内容 |
---|---|
状態を分ける | 行動ごとに明確な状態を定義する |
条件で切り替え | トリガーに応じて状態遷移する |
見通しが良い | AIの処理が分かりやすく、管理しやすい |
拡張しやすい | 新しい状態や動作も追加しやすい |
FSMは、複雑なAIを直感的に整理できる便利な仕組みです。
個人開発でも、敵の挙動に「動きの幅」と「賢さ」を持たせたいときに非常に役立ちます。
コメント