0Pricing
Lua Academy · 课时

使用状态机实现人工智能行为

完全使用 Lua 脚本实现基于 FSM 的敌方人工智能逻辑。

使用状态机实现人工智能行为 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

什么是有限状态机

有限状态机(FSM)将行为定义为一组状态,状态之间通过由条件或事件触发的转换相互连接。

FSM 表结构

将 FSM 表示为一个表,其中包含当前状态、状态表,以及每个状态可选的进入、退出和更新回调。

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
}

转换函数

转换函数会调用当前状态的退出函数,切换状态,然后调用新状态的进入函数。

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
end

更新 FSM

在每个游戏时钟周期调用 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"},
}

堆叠状态机

状态栈允许临时状态(例如“眩晕”)压入当前状态之上,并在临时状态结束后恢复原状态。

多个 AI 代理

每个敌方实体都有自己的 FSM 实例,因此它们的 AI 会彼此独立地运行。借助 Lua 表和闭包,实现这一点非常容易。

调试 FSM

在开发期间记录所有状态转换。跟踪表会存储 {from, to, time},用于事后分析 AI 行为。

FSM 问题

FSM 中的状态转换由什么触发?

回顾:使用状态机构建 AI

Lua FSM 使用由状态对象(进入、更新、退出)构成的表,并配合转换函数。它能清晰分离 AI 职责,支持数据驱动的设计,并可从简单的敌人逻辑扩展到复杂的分层行为树。

常见问题解答

「使用状态机实现人工智能行为」课时是免费的吗?

是的 — 「使用状态机实现人工智能行为」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「使用状态机实现人工智能行为」这节课中我会学到什么?

完全使用 Lua 脚本实现基于 FSM 的敌方人工智能逻辑。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用状态机实现人工智能行为」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Lua 中的事件系统
  2. 基于组件的脚本编程
  3. 使用状态机实现人工智能行为
  4. 数据驱动配置和热重载
← 返回 Lua Academy