Entitas CookBook 翻譯 - 104_Group 組合

Group 組合

對于ECS來說,一個典型的"Hello world"就是所謂的"move system"。move system匕争,是一個獲取所有擁有Position以及Velocity組件的Entity横蜒,并且更新他們的Position 信息,讓他們有效的超目標(biāo)Velocity移動的System互亮。當(dāng)我們意識到這個Entity上的其他Component并不重要時,自然就會明白這個道理余素。這個實體可以是人豹休,狗,汽車桨吊,直升機或房子威根。但如果它有一個Position組件和一個Velocity組件,它必須移動视乐。

那我們怎么獲取這些實體呢洛搀?

如Context 章節(jié)中所述,Context管理著所有實體佑淀,因此我們可以向Context請求并遍歷所有Entity留美,從而收集具有Position以及Velocity 的那些Entites。這將是一個非常幼稚(naive)的實現(xiàn)伸刃。針對這種情況下谎砾,我們在Entitas中應(yīng)對措施就是Group

context.GetGroup(GameMatcher.AllOf(GameMatcher.Position, GameMatcher.Velocity));

在上面的代碼片中捧颅,我們要求一個Context為我們提供一個包含著所有擁有Position以及Velocity的Entities的Group景图。Group中包含的實體都是最新的,這意味著如果您從實體中刪除某個Position碉哑,Entity就會從Group中被移除挚币。如果您將Position和Velocity組件添加到Entity亮蒋,它將直接進(jìn)入該Group。

你可以任意使用Group妆毕,因為他們在內(nèi)部是被重用的慎玖。Context會儲存一個內(nèi)部List保存所有你請求過的Group,所以如果你使用相同的Matcher訪問Group笛粘,你就會獲取到一個已經(jīng)存在的引用凄吏。既然說到Matchers。闰蛔。。

Matcher 匹配器

Matcher是我們?nèi)绾蚊枋鑫覀兏信d趣的Entity的一種方式图柏。你可以說它就是我們的小型查詢語言(query language)序六。 GameMatcher意味著我們有一個GameContext(請參閱Context章節(jié)中的多個Context類型部分),我們可以訪問與此Context相關(guān)的所有Component類型蚤吹。如果我們寫context.GetGroup(GameMatcher.Position);我們會得到一組包含Position組件的Entites例诀。為了定義更復(fù)雜的Group,我們可以使用AllOf裁着,AnyOfNoneOf方法繁涂。 “AllOf”表示所有列出的Component都必須出現(xiàn)在Entity中才能使此Entity成為Group的一部分;“AnyOf”表示必須存在列出的組件中的一個二驰;而在NoneOf的情況下扔罪,我們則不希望任何列出的組件存在。 NoneOf不是一個獨立的描述桶雀,這意味著你將無法編寫context.GetGroup(GameMatcher.NoneOf(GameMatcher.Position));因為它會創(chuàng)建一個非常大的集合矿酵,所以是被禁止單獨使用的。 NoneOf只能與AllOfAnyOf結(jié)合使用矗积。

context.GetGroup(GameMatcher.AllOf(GameMatcher.Position, GameMatcher.Velocity).NoneOf(GameMatcher.NotMovable));

這樣子我們就能得到一個擁有Position,Velocity但是又沒有NotMovable組件的Group Of Entities了全肮。

AllOfAnyOf 也能被組合成: context.GetGroup(Matcher.AllOf(Matcher.A, Matcher.B).AnyOf(Matcher.C, Matcher.D).NoneOf(Matcher.E))

matcher也能是從AnyOf開始的: context.GetGroup(Matcher.AnyOf(Matcher.C, Matcher.D).NoneOf(Matcher.E))

Group observation 組合的觀察

就像我說過的,Group永遠(yuǎn)都是最新的棘捣,所以他會提供一個非常方便的方法讓我們觀察它辜腺,并且當(dāng)Entity加入、移除時接收到通知乍恐。更重要的是评疗,但我們replace(置換)一個entity上的component時,舊的component會被移除然后加上新的component禁熏。這就意味著我們的entity會暫時離開然后馬上重新加入group壤巷。這就給我們的響應(yīng)式編程提供一個良好的基礎(chǔ)。

在Entitas-CSharp中瞧毙,我們不會真的刪除或者添加一個Component胧华。生成出來的代碼會先向用戶請求新的值寄症,觸發(fā)移除component的事件,設(shè)置一個新的值給這個component矩动,然后觸發(fā)一次增加component的事件有巧。用這個方法,我們就避免了內(nèi)存的分配以及模擬了一個在使用不可修改(immutable)component的感覺悲没。

Group里面有這幾種事件可以監(jiān)聽:

  • OnEntityAdded
  • OnEntityRemoved
  • OnEntityUpdated

其他的原料像Collector篮迎,Index以及Reactive system都是使用這些事件。所以如果你只是日常使用的話示姿,你完全可以直接用他們甜橱。但是如果你想制作一些自定義的東西,你可能需要了解其中的實現(xiàn)細(xì)節(jié)栈戳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岂傲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子子檀,更是在濱河造成了極大的恐慌镊掖,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褂痰,死亡現(xiàn)場離奇詭異亩进,居然都是意外死亡,警方通過查閱死者的電腦和手機缩歪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門归薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匪蝙,你說我怎么就攤上這事苟翻。” “怎么了骗污?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵崇猫,是天一觀的道長。 經(jīng)常有香客問我需忿,道長诅炉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任屋厘,我火速辦了婚禮涕烧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汗洒。我一直安慰自己议纯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布溢谤。 她就那樣靜靜地躺著瞻凤,像睡著了一般憨攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阀参,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天肝集,我揣著相機與錄音,去河邊找鬼蛛壳。 笑死杏瞻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衙荐。 我是一名探鬼主播捞挥,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忧吟!你這毒婦竟也來了树肃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瀑罗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雏掠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斩祭,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年乡话,在試婚紗的時候發(fā)現(xiàn)自己被綠了摧玫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡绑青,死狀恐怖诬像,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闸婴,我是刑警寧澤坏挠,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站邪乍,受9級特大地震影響降狠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庇楞,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一榜配、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吕晌,春花似錦蛋褥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膜廊。三九已至,卻和暖如春弃理,著一層夾襖步出監(jiān)牢的瞬間溃论,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工痘昌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钥勋,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓辆苔,卻偏偏與公主長得像算灸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驻啤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理菲驴,服務(wù)發(fā)現(xiàn),斷路器骑冗,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評論 6 342
  • CES設(shè)計模式從提出至今已經(jīng)在諸如《守望先鋒》等很多大型游戲中得到了有效的應(yīng)用赊瞬。在應(yīng)對游戲迅速遞增的復(fù)雜需求和設(shè)計...
    ZerLon51閱讀 1,324評論 0 1
  • 我在風(fēng)里老去 手持一個空碗 時間阻隔了我 老而彌堅 白髭須沾染風(fēng)露 我用刻刀在水里 劃一道泉 天井里映著浮塵點點 ...
    斯人會閱讀 316評論 0 0
  • 今年的冬天感覺特別冷!又想起一個摯友說的一句話“溫暖的被窩是青春的墳?zāi)埂痹羯6蚁胪f我的青春是什么巧涧? 今天早起的...
    Coco賴閱讀 204評論 0 0