ECS:WriteGroup

定义:
使用WriteGroup标记了同一个component的components就属于一个WriteGroup:
    public struct W : IComponentData
    {
       public int Value;
    }
    [WriteGroup(typeof(W))]
    public struct A : IComponentData
    {
       public int Value;
    }
    [WriteGroup(typeof(W))]
    public struct B : IComponentData
    {
       public int Value;
    }
    上面的代码中,W A B就属于同一个W Group。
 
使用:
让WriteGroup生效的方法:在Query中开启WriteGroup选项:
public class AddingSystem : JobComponentSystem
{
   protected override JobHandle OnUpdate(JobHandle inputDeps) {
      return Entities
         .WithEntityQueryOptions(EntityQueryOptions.FilterWriteGroup)
         .ForEach((ref W w, in B b) => { }).Schedule(inputDeps);}
}
使用EntityQueryDesc: 
public class AddingSystem : JobComponentSystem
{
   private EntityQuery m_Query;
   protected override void OnCreate()
   {
       var queryDescription = new EntityQueryDesc
       {
           All = new ComponentType[] {
              ComponentType.ReadWrite<W>(),
              ComponentType.ReadOnly<B>()
           },
           Options = EntityQueryOptions.FilterWriteGroup
       };
       m_Query = GetEntityQuery(queryDescription);
   }
   // Define Job and schedule...
}
这样,在Query的时候,WriteGroup就会影响查询的结果了。
 
规则:
(1)同一个Group的components,查询时只会包含一个,同组的component相互是互斥的,比如上面的W A B,查询结果只会返回包含W A B任意一个的entity;
(2)可以显示的要求包含同组的其他component。
以此规则计算,上面的例子中,query结果是包含W和B的,包含A的会被排除。
 
应用:
(1)扩展或覆盖原有system功能的写入目标,可以保证原来的system正常工作,但是包含了自己的特殊component的entity按照覆盖的方式工作。
    Unity.Transforms里面的每一个component都是用了write group的特性。
(2)提供system的可扩展性。
 
 
posted @ 2020-02-29 21:58  斯芬克斯  阅读(743)  评论(0编辑  收藏  举报