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


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的啊

这个误会大了真的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容