基于组件的脚本编程
在 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 反馈 — 无需本地设置。
此课程中的所有课时
- Lua 中的事件系统
- 基于组件的脚本编程
- 使用状态机实现人工智能行为
- 数据驱动配置和热重载