起因是因为用Entitas写游戏逻辑感觉舒服,但是发现没有lua版本(但其实后来才发现原来是有的, 不过基本都没有做代码生成), 这是一个Entitas_Lua实现。
- 需要Python3.x环境 (配置环境变量)
- 安装python模板引擎Mako, 用于解析lua代码的差距 lupa, 用于处理跨平台生成的 pathlib pip install mako pip install lupa pip install pathlib
- cd src
python build.py 可以执行生成
EntitasConfig路径下的文件为Ecs的生成配置, 这是一个简单的示例。
配合使用Emmlylua插件为最佳体验, 感谢阿唐为我们提供如此好用的lua插件。(没有EmmyLua插件。。Ecs_lua使用体验会差很多)
原版本参照Entitas-csharp 和 entitas-lua. 有较大修改.
因为以前的版本参照ts实现较为复杂, 所以使用别人已经写好的简单版本.
与Entitas-csharp 最大的不同为 lua中没有getter, setter的功能, 对于getter, setter, 直接使用函数替代. 如 以前的 e.isDestroy 变为 e:hasDestroy() (之前有实现一个版本 使用__index和__newindex 模拟get, set的处理, 考虑复杂度和性能, 放弃了)
如果需要查看一些使用文档, 建议查看原始版本Entitas C# Wiki,因为该实现与原始实现基本是一致的
---@class entitas.Event
---@field eventTarget entitas.gen.EventTarget
---@field eventType entitas.gen.EventType
---@field priority number
---@class entitas.EventTarget
EventTarget = { -- 事件目标
Any = 'Any',
Self = 'Self'
}
---@class entitas.EventType
EventType = { --事件目标类型
ADDED = 'ADDED',
REMOVED = 'REMOVED',
ALL = 'ALL',
}
AttrDefine = { --扩展定义
Index = { --属性扩展 对应IndexHandler
attrList = {
'index', 'primaryIndex', 'muIndex'
},
handleTogether = true
},
Event = { -- 事件扩展, EventHandler
},
SendMsg = { -- 发送事件类型扩展, 对应 SendMsgHandler
},
--其他你相遇扩展的自定义属性, 可以参考 SendMsg进行扩展处理 用户扩展生成的方式
}
tag = { --tag 定义, 每个component 都必须有至少一个tag的定义
Player = 'Player',
Prop = 'Prop',
Dress = 'Dress',
User = 'User',
PlayPlayer = 'PlayPlayer',
Stage = 'Stage'
}
local entitas = { --总配置 用于配置路径和一些其他设置
namespace ="Entitas", --生成的命令空间, 用emmylua插件的时候 对于class 的标记 有命名空间的需求(暂时没用上)
source ="Common.entitas", -- luaentitas 底层代码路径( 用于生成require路径)
output ="../Common/Generated/entitas", -- 生成代码输出位置
service_path = "../src/Entitas", -- 对于每一个context都会生成一个service, 这个是存放路径
parse = "lua", -- 解析后缀, 本意是可以提供不同的配置和生成器, 用于生成不同语言的版本, (我之前有做htm5), 但是json不能有注释, 所以放弃了对于json的支持
tag = tag, --tag组
AttrDefine = AttrDefine -- 属性扩展组
}
return entitas
Component:
return {
type_id = { -- component名字
data ={ -- component数据定义, 如果没有定义数据, 则默认为是标记component
"value : number" 格式为: 变量名 : 注释名字 @ attr | attr .. (目前字段的 attr仅支持 index 和 primaryIndex 这个属于内置支持)
},
-- 对于标记类型, 不会生成replace方法, 相应的会生成一个 set方法, 用于区分
attr = { -- 扩展属性定义, 每一个扩展属性定义都是一个table, 且以数组形式排列
{
attr_define = 'Event', -- 属性名 会用名字 + Handler 找到用于处理这个属性的脚本, 并运行
eventTarget = EventTarget.Self, -- 属性参数 对于事件类型, 需要提供target参数( 详细请参照原版)
eventType = EventType.ADDED, -- 属性参数 对于事件类型, 需要提供target参数( 详细请参照原版)
},
{
attr_define = 'SendMsg', -- 属性名 会用名字 + Handler 找到用于处理这个属性的脚本
eventType = EventType.ALL -- 对于sendmsg类型, 也需要关心事件类型.
}
},
tag = { tag.Dress} --标记这个component 属于那个 context, 可以配置多个
},
num = {
data = {
"value : number"
},
tag = { tag.Dress}
},
config = { -- 衣服配置
data = {
"value : DressTemplateData"
},
tag = { tag.Dress}
},
itemInfo = { --道具信息
data ={
"value : ItemInfo",
},
tag = { tag.Dress}
}
}
测试环境: lua5.3.4, windows 测试方法: bash: ./luaexe/lua.exe test.lua (需要先进行生成)
- 与Unity Inspector显示的连接,与监测
- 生成API优化 (目前有一些参数传递可能是多余的, 然后所有的ComponentIndex,其实可以全部直接使用数字, 因为既然是生成的API,也不用去考虑可读性)已完成
- 考虑实现C#版本Event的标签 已完成
- 支持index和primaryindex标签 已完成
- 配置文件优化, 支持以tag方式区分不同的Context 已完成
- 增加sync类型, 用于双端架构, 用于对客户端和服务器自动同步数据使用
- 提供统一的 attr 自定义 方式
- 简单的Demo 1o. 生成代码 改为用python_Entitas实现
- 优化matcher的匹配规则, 把字符串拼接拿掉
修改说明:
主要是因为当我们有扩展需求的时候, 需要写自己的属性扩展处理器. 对于正常的生成, 大家应该是没有扩展的需求, 但是有一些特定扩展, 是根据项目来的. 所以大家会有自己的扩展的需求. v1.0.1就是为了解决这个问题.
1. 主要是python那边 采用了 entitas 用于组织数据, 用生成的方式代替重写, 不过只有简单的支持, 没有对于attr 属性扩展支持. 未来可能会考虑扩展python部分的实现, 不过就目前来说已经够用了. entitas的数据组织是高内聚的方式(所以也可以用其他方式, 只要是高内聚就可以, 同时使用代码生成的方法, 省去api编写的时间) , 对于扩展处理 需要数据的时候会特别方便.
- 与Unity Inspector显示的连接,与监测
- 生成API优化 (目前有一些参数传递可能是多余的, 然后所有的ComponentIndex,其实可以全部直接使用数字, 因为既然是生成的API,也不用去考虑可读性)已完成
- 考虑实现C#版本Event的标签 已完成
- 支持index和primaryindex标签 已完成
- 配置文件优化, 支持以tag方式区分不同的Context 已完成
- 增加sync类型, 用于双端架构, 用于对客户端和服务器自动同步数据使用
- 提供统一的 attr 自定义 方式
- 简单的Demo 1o. 生成代码 改为用python_Entitas实现
- 优化matcher的匹配规则, 把字符串拼接拿掉