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);
結(jié)果:
A component with type:TimeComponentData has not been added to the entity.
此時(shí)debugger窗口顯示只出現(xiàn)了一個(gè)entity, 具有timecomponent,但是timecomponentdata沒(méi)有被設(shè)置進(jìn)去街图,很奇怪尔艇。
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);
此時(shí)沒(méi)有報(bào)錯(cuò)
但是
很明顯用Xcomponent無(wú)法獲取entity的原因是entity實(shí)際上添加的是XcomponentData的組件媒鼓。
那么我們?nèi)绶ㄅ谥频南胍砑覺(jué)component進(jìn)去行不行
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類(lèi)不是能用做泛型的提前,說(shuō)白了就是沒(méi)繼承IComponentdata
我有了一個(gè)大膽的猜想伏蚊,如果直接使用Componentdata就可以作為組件添加進(jìn)去巡通,存儲(chǔ)數(shù)據(jù),是不是也可也被system識(shí)別呢
如果可以的話(huà)鹃祖,ComponentDatal類(lèi)本身是不是就是承擔(dān)了Component的功能呢溪椎?
這一層封裝意義何在呢?
聯(lián)想到我之前gameobject.addcomponent<TimeComponent>()成功把TimeComponentData組件裝上了Entity,還被我認(rèn)為是bug校读,難道TimeComponent的存在僅僅是為了能夠直接從gameobject添加?
細(xì)思恐極沼侣,還沒(méi)來(lái)得及測(cè)試,我就直接搜索了addComponent相關(guān)歉秫,然后搜到了這個(gè)
驗(yàn)證了我的判斷蛾洛;
我的天!我為什么可以誤解如此之深還這么久雁芙?轧膘??兔甘?
簡(jiǎn)單來(lái)說(shuō)扶供,我之前的認(rèn)知是,存儲(chǔ)數(shù)據(jù)的componentdata繼承IComponentdata裂明,
而Component是要在Component外面加裝一層皮才成為Component的,
也是有這一層莫名其妙的封裝才可以被system識(shí)別(老實(shí)講沒(méi)記錯(cuò)的話(huà),這個(gè)封裝因?yàn)榻涌谥型咀兓脑蜻€折騰我很久),?
所以理所應(yīng)當(dāng)太援,addComponent()里面應(yīng)該用的是createType(Component)闽晦,addComponentData里面應(yīng)該用的是new ComponentData(),
并且addComponentData就是自動(dòng)生成了一個(gè)Component并且把它的value設(shè)置成了這個(gè)ComponentData提岔,
邏輯上完美有沒(méi)有仙蛉!
可是最開(kāi)始是誰(shuí)啟發(fā)的我有一個(gè)錯(cuò)誤的邏輯呢?
讓我找到了讓我入門(mén)ECS的文章
https://zhuanlan.zhihu.com/p/55264786
就是這一段代碼碱蒙,我直接復(fù)制了進(jìn)去荠瘪。(還因?yàn)镃omponentDataWrapper失效折騰了很久)
但是其實(shí)文章沒(méi)說(shuō)錯(cuò),那我為什么會(huì)認(rèn)為Component才是被system識(shí)別的呢赛惩?才是綁定在entity上面的組件呢哀墓?
一,大多數(shù)文章沒(méi)有給出enitity上組件的截圖
二喷兼,我天真的看名字推測(cè)了
看這個(gè)名字篮绰,GravityComponent就應(yīng)該是被識(shí)別的和綁定的那個(gè)Component啊季惯!
何況unity自己的API里吠各,既有addComponent()也有addComponentData!我當(dāng)然以為是Component和ComponentData就是一表一里,需要被添加進(jìn)Enitity的啊
這個(gè)誤會(huì)大了真的