ステートマシンによるAIの振る舞い
FSMベースの敵AIロジックをすべてLuaスクリプトで実装します。
「ステートマシンによるAIの振る舞い」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
有限状態機械とは
有限状態機械(FSM)は、条件やイベントによって引き起こされる状態間の遷移を使って、振る舞いを定義します。
FSMのテーブル構造
FSMは、現在の状態、状態テーブル、および状態ごとの任意のenter/exit/updateコールバックを持つテーブルとして表現します。
local function newFSM(initialState)
return {
current = initialState,
states = {},
}
end状態の定義
各状態は、任意のenter、update、exit関数を持つテーブルです。
local fsm = newFSM("idle")
fsm.states.idle = {
enter = function(self) print("Enter idle") end,
update = function(self, dt)
if self.enemy then self:transition("chase") end
end,
exit = function(self) print("Exit idle") end
}追跡状態の追加
追跡状態ではプレイヤーを追跡し、十分に近づくと攻撃状態へ遷移します。
fsm.states.chase = {
enter = function(self) print("Chasing!") end,
update = function(self, dt)
if self.distToPlayer < 2 then
self:transition("attack")
elseif not self.enemy then
self:transition("idle")
end
end
}遷移関数
遷移では、現在の状態のexitを呼び出し、状態を変更してから、新しい状態のenterを呼び出します。
function fsm:transition(newState)
local cur = self.states[self.current]
if cur and cur.exit then cur:exit() end
self.current = newState
local next = self.states[newState]
if next and next.enter then next:enter() end
endFSMの更新
ゲームの各ティックでfsm:update(dt)を呼び出し、現在の状態の更新処理を実行します。
function fsm:update(dt)
local state = self.states[self.current]
if state and state.update then
state:update(dt)
end
end階層型ステートマシン
状態には入れ子のFSMを含められます。親状態が大まかな振る舞い(戦闘と巡回など)を処理し、子FSMが各親状態内の詳細を処理します。
データ駆動型FSM
FSMの遷移を設定ファイルから読み込むデータテーブルとして定義します。これにより、コードに触れずにデザイナーがAIを調整できます。
local transitions = {
idle = {seeEnemy = "chase"},
chase = {lostEnemy = "idle", nearEnemy = "attack"},
attack = {enemyDead = "idle"},
}スタック型ステートマシン
状態スタックを使うと、一時的な状態(例:"stunned")を現在の状態の上に積み、終了後に元の状態へ戻せます。
複数のAIエージェント
各敵エンティティは独自のFSMインスタンスを持つため、AIはそれぞれ独立して動作します。Luaのテーブルとクロージャを使えば簡単に実現できます。
FSMのデバッグ
開発中はすべての遷移をログに記録します。トレーステーブルに{from, to, time}を保存すると、AIの動作を事後分析できます。
FSMの質問
FSMで状態遷移を引き起こすものは何ですか。
復習:ステートマシンによるAI
LuaのFSMでは、状態オブジェクト(enter/update/exit)のテーブルと遷移関数を使います。AIの関心事を明確に分離でき、データ駆動設計にも対応し、単純な敵のAIから複雑な階層型の振る舞いツリーまで拡張できます。
よくある質問
「ステートマシンによるAIの振る舞い」レッスンは無料ですか?
はい。「ステートマシンによるAIの振る舞い」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「ステートマシンによるAIの振る舞い」で何を学びますか?
FSMベースの敵AIロジックをすべてLuaスクリプトで実装します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ステートマシンによるAIの振る舞い」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Luaのイベントシステム
- コンポーネントベースのスクリプト
- ステートマシンによるAIの振る舞い
- データ駆動型設定とホットリロード