0Pricing
Lua Academy · 课时

基于组件的脚本编程

在 Lua 中将游戏实体设计为带有行为组件的表。

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

什么是基于组件的设计

实体不是采用深层的类层次结构,而是由组件组合而成;组件是存储数据和行为的小型专用表。实体本身只是组件的集合。

作为表的实体

实体是一个包含 id 和 components 子表的表。组件可以在运行时添加和移除。

local function newEntity(id)
  return {id = id, components = {}}
end
local player = newEntity(1)

添加组件

在组件表中设置一个命名键,即可附加组件。

player.components.position = {x=0, y=0}
player.components.health   = {hp=100, max=100}
player.components.sprite   = {image="player.png", scale=1}

系统处理组件

系统会处理所有拥有指定必需组件集合的实体。系统遍历实体并更新组件数据。

local function moveSystem(entities, dt)
  for _, e in ipairs(entities) do
    local pos = e.components.position
    local vel = e.components.velocity
    if pos and vel then
      pos.x = pos.x + vel.dx * dt
      pos.y = pos.y + vel.dy * dt
    end
  end
end

组件脚本

将 Lua 函数作为组件行为附加上去,为每个实体提供一种简单的脚本机制。

player.components.ai = {
  update = function(self, entity, dt)
    -- move towards target
  end
}

组件注册表

注册表将组件类型名称映射到工厂函数,从而可以按名称创建组件(例如从关卡文件中创建)。

local registry = {}
function registry.register(name, factory)
  registry[name] = factory
end
function registry.create(name, ...)
  return registry[name](...)
end

移除组件

将组件设为 nil 即可移除它。之后,需要该组件的系统会忽略此实体。

player.components.health = nil  -- entity is "dead"

世界与实体管理器

World 对象存储所有实体和系统,在每个时钟周期遍历系统,并提供实体查询 API。

按组件查询实体

提供一个查询函数,返回拥有所有指定组件的实体。

local function query(world, ...)
  local required = {...}
  local result = {}
  for _, e in ipairs(world.entities) do
    local ok = true
    for _, comp in ipairs(required) do
      if not e.components[comp] then ok = false; break end
    end
    if ok then result[#result+1] = e end
  end
  return result
end

预制体

预制体是一个由组件构成的模板表。通过深拷贝模板,可以从预制体实例化新实体。

相较于继承的优点

  • 没有深层的层次结构。
  • 行为可以在运行时混合组合。
  • 易于添加或移除功能。
  • 由配置文件驱动数据。

组件设计问题

在基于组件的设计中,系统负责做什么?

回顾:基于组件的脚本编程

实体是由组件构成的表。系统处理拥有必需组件的实体。这种解耦、数据驱动的架构比深层继承层次结构更加灵活,并且天然适用于 Lua。

常见问题解答

「基于组件的脚本编程」课时是免费的吗?

是的 — 「基于组件的脚本编程」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「基于组件的脚本编程」这节课中我会学到什么?

在 Lua 中将游戏实体设计为带有行为组件的表。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

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

「基于组件的脚本编程」课时需要多长时间?

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

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

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

此课程中的所有课时

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