码迷,mamicode.com
首页 > 其他好文 > 详细

ECS:WriteGroup

时间:2020-02-29 22:47:43      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:upd   方式   特殊   自己的   ado   transform   nbsp   显示   fine   

定义:
使用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的可扩展性。
 
 

ECS:WriteGroup

标签:upd   方式   特殊   自己的   ado   transform   nbsp   显示   fine   

原文地址:https://www.cnblogs.com/sifenkesi/p/12386453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!