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

2019-05-25  本文已影响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的啊

这个误会大了真的

上一篇下一篇

猜你喜欢

热点阅读