当一个实体被删除时,会有以下几步操作
但当存在 State 组件时,实体不会被删除,只会删除除了 State 组件以外的组件
当配合使用 StateComponentData 与 ComponentData 时可以实现观察实体当前的状态
Tag(ComponentData) | State(StateComponentData) |
---|---|
Tag 存在,State 缺失 | 实体刚被创建,未被初始化 |
Tag 存在,State 存在 | 实体已被初始化,可以使用 |
Tag 存在,State 存在 | 实体处于删除状态 |
例如:
Entities
.WithAll<Tag>()
.WithNone<State>()
.WithStructuralChanges()
.ForEach((Entity entity) =>{
// Spawn
}).Run();
Entities
.WithAll<Tag>()
.WithAll<State>()
.ForEach((Entity entity) =>{
// Update
}).Run();
Entities
.WithNone<Tag>()
.WithAll<State>()
.ForEach((Entity entity) =>{
// Destroy
}).Run();
( EntityCommandBuffer 以下简称 ECB)
ECB 主要解决了两个问题
结构化改变包括
同步点
当我们在使用 Job 时,为了防止多线程运行时对同一个实体进行了冲突的操作时,同步点的存在是必要的
例如:当线程 A 对实体 a1 的组件进行了删除操作,线程 B 又去获取实体 a1 被删除的组件时,就会发生错误
所以当我们使用了 Job 的多线程时,需要使用 ECB 来延迟结构化改变操作,统一到同步点内再进行操作
留言系统我们肯定都不陌生,不止是在游戏里,很多地方都有留言系统的存在
视频上的评论信息,弹幕这些都是留言系统的一种,而游戏中的留言系统可以做的更加复杂
例如魂系列游戏中的建言,《尼尔:机械纪元》结尾的玩家留言以及保护你的小飞机,这些创新让人眼前一亮
有一个更有趣的设计,来自《Moirai》这款免费的像素游戏
简略的讲一下它的设计,在游戏里你会在洞穴里遇到一个满身的血,拿着刀的NPC
你上前对话,会有四个选项
你得到的回答可能完全不合逻辑,NPC看起来像在胡言乱语
你会感到疑惑,但当你玩到游戏结尾,当你满身是血,手里拿着刀,又遇到了一个NPC时
系统让你回答刚才那几个问题的时候你才明白,这是一个轮回
你的回答会变成别人游玩时,他们游戏中NPC的回答
同样,如果你注意到了第四个选项,你就会明白别人可以决定在他们游戏中,“你”的生死
你的操作会影响别人的游戏体验,这很有趣
如果这一类似机制被放在 MMORPG 中,不知道会产生怎样的效果