今天发现到这个问题,不是BUG,而是一个比较容易疏忽的地方,特地写一下。

当我们需要在JobSystem下增删Entity/Component的时候,通常借助于创建一个Barrier(Unity ECS新版本下已改名为EntityComponentBufferSystem)的EntityCommandBuffer来进行后置操作。

而ECBSystem既然也是一个ComponentSystem,自然需要在执行序列中排在一个位置上。这里就是核心问题了,他的执行顺序并不一定在创建他的主System后面,甚至如果没有给他好好设置系统组(ComponentSystemGroup)的话,他会在你的主System前面。也就是说前一帧请求的增删得到下一帧才执行。

一般而言这没有什么问题。但是如果你的主系统要依赖后续其他系统在这之后进行处理的结果,那么延迟一帧就有可能带来逻辑上的错误了。

解决方法自然就是为ECSSystem也通过UpdateIn/After/Before标签设置好执行顺序,让他好好的呆在他的主System后面。

PS:要注意的是,尽管ECS系统完美的规避了系统之间的显性耦合,但是我这个例子体现了最为“邪恶”的耦合情形之一:两个系统都对同一个Compoent进行逻辑检查,从而构成了隐性耦合关系。虽然通过严格限制系统执行顺序解决了当前问题,但是还是应该从设计层面考虑如何消除这种耦合关系的。

{{uname}}

{{meta.replies}} 条回复
写下第一个评论!

-----------到底了-----------