美文网首页
ECS踩得坑:ComponentData才是真正的Compone

ECS踩得坑:ComponentData才是真正的Compone

作者: 非墨即白 | 来源:发表于2019-05-25 18:00 被阅读0次

    Location loc= point.location;                                                                        TimeComponentData time= new TimeComponentData(p.time);

    EntityManager.AddComponent(objentity.Entity,ComponentType.Create<TimeComponent>());

    EntityManager.AddComponent(objentity.Entity,ComponentType.Create<LocationComponent>()); EntityManager.AddComponent(objentity.Entity,ComponentType.Create<PointComponent>());

    EntityManager.SetComponentData(objentity.Entity, time); EntityManager.SetComponentData(objentity.Entity, loc); EntityManager.SetComponentData(objentity.Entity, point);

    结果:

    A component with type:TimeComponentData has not been added to the entity.

    此时debugger窗口显示只出现了一个entity, 具有timecomponent,但是timecomponentdata没有被设置进去,很奇怪。

    EntityManager.AddComponent(objentity.Entity, ComponentType.Create<TimeComponentData>()); EntityManager.AddComponent(objentity.Entity, ComponentType.Create<Location>()); EntityManager.AddComponent(objentity.Entity, ComponentType.Create<PointComponentData>()); EntityManager.SetComponentData(objentity.Entity, time); EntityManager.SetComponentData(objentity.Entity, loc); EntityManager.SetComponentData(objentity.Entity, point);

    此时没有报错

    但是

    很明显用Xcomponent无法获取entity的原因是entity实际上添加的是XcomponentData的组件。

    那么我们如法炮制的想要添加Xcomponent进去行不行

    Location loc= point.location;

    TimeComponentData time= new TimeComponentData(p.time); EntityManager.AddComponent(objentity.Entity,ComponentType.Create<TimeComponent>());

    EntityManager.AddComponent(objentity.Entity,ComponentType.Create<LocationComponent>());

    EntityManager.AddComponent(objentity.Entity,ComponentType.Create<PointComponent>());

    TimeComponent tc = new TimeComponent();

    tc.Value = time;

    EntityManager.SetComponentData(objentity.Entity, tc);

    不行

    TimeComponent类不是能用做泛型的,说白了就是没继承IComponentdata

    我有了一个大胆的猜想,如果直接使用Componentdata就可以作为组件添加进去,存储数据,是不是也可也被system识别呢

    如果可以的话,ComponentDatal类本身是不是就是承担了Component的功能呢?

    这一层封装意义何在呢?

    联想到我之前gameobject.addcomponent<TimeComponent>()成功把TimeComponentData组件装上了Entity,还被我认为是bug,难道TimeComponent的存在仅仅是为了能够直接从gameobject添加?

    细思恐极,还没来得及测试,我就直接搜索了addComponent相关,然后搜到了这个

    https://docs.google.com/presentation/d/1tzsCUfn6Q_u33Ac4DIfWNAgJECvLwhV5r0eXCkEUd5U/edit#slide=id.g39fef64ece_0_278

    验证了我的判断;

    我的天!我为什么可以误解如此之深还这么久????

    简单来说,我之前的认知是,存储数据的componentdata继承IComponentdata,

    而Component是要在Component外面加装一层皮才成为Component的,

    也是有这一层莫名其妙的封装才可以被system识别(老实讲没记错的话,这个封装因为接口中途变化的原因还折腾我很久), 

    所以理所应当,addComponent()里面应该用的是createType(Component),addComponentData里面应该用的是new ComponentData(),

    并且addComponentData就是自动生成了一个Component并且把它的value设置成了这个ComponentData,

    逻辑上完美有没有!

    可是最开始是谁启发的我有一个错误的逻辑呢?

    让我找到了让我入门ECS的文章

    https://zhuanlan.zhihu.com/p/55264786

    就是这一段代码,我直接复制了进去。(还因为ComponentDataWrapper失效折腾了很久)

    但是其实文章没说错,那我为什么会认为Component才是被system识别的呢?才是绑定在entity上面的组件呢?

    一,大多数文章没有给出enitity上组件的截图

    二,我天真的看名字推测了

    看这个名字,GravityComponent就应该是被识别的和绑定的那个Component啊!

    何况unity自己的API里,既有addComponent()也有addComponentData!我当然以为是Component和ComponentData就是一表一里,需要被添加进Enitity的啊

    这个误会大了真的

    相关文章

      网友评论

          本文标题:ECS踩得坑:ComponentData才是真正的Compone

          本文链接:https://www.haomeiwen.com/subject/zxhazqtx.html