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相关,然后搜到了这个
验证了我的判断;
我的天!我为什么可以误解如此之深还这么久????
简单来说,我之前的认知是,存储数据的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的啊
这个误会大了真的
网友评论