Entitas CookBook 翻譯 - 106_Index 索引

Index 索引

當我們想獲取所有擁有Position Component 的Entity的時候,我們會創(chuàng)建一個Group然后遍歷他器钟。但是,如果我們只想獲取某個Position上的Entity時逻族,我們要怎么做呢?我們可以遍歷所有有Position Component的Entity然后找到特定Position的Entity氮块,或者我們可以用Index。

為了創(chuàng)建一個索引诡宗,我們需要給Component增加以下屬性(注釋):

using Entitas;
using Entitas.CodeGeneration.Attributes;

[Game]
public sealed class PositionComponent : IComponent {

    [EntityIndex]
    public IntVector2 value;
}

這個EntityIndex屬性會告訴我們的代碼生成器滔蝉,在Context上創(chuàng)建一個讓用戶能夠根據(jù)IntVector2來獲取Entities的API。

這是MatchOne例子上從ProcessInputSystem中提取出來的代碼片段:

foreach (var e in _contexts.game.GetEntitiesWithPosition(
                    new IntVector2(input.x, input.y)
                  ).Where(e => e.isInteractive)) {
    e.isDestroyed = true;
}

在這個片段中塔沃,我們向Context請求所有所有“input”位置上的Entities并且篩選出所有interactive的Entities蝠引。

在內(nèi)部,Index其實就是一個group觀察者蛀柴。他在context初始化的時候創(chuàng)建螃概,從一開始就訂閱了group變化的事件。當我們開始創(chuàng)建entites并且在上面增加components時鸽疾,他們就會進入groups以及index會被通知到entity被增加了對應(yīng)的component吊洼。我們可以使用component的值來做哈希表中的key,entity本身作為value制肮。這樣我們就建立起了一個index冒窍。當我們replace或者 remove component的時候,這個index也會被通知到豺鼻,它會獲取到之前的component综液。所以當我們在entity中replace成其他component的時候,index會從哈希表中移除舊component的key儒飒,并且接受到一個帶有新的value的added event谬莹。

在Entitas-CSharp中,我們有兩種內(nèi)置的index约素。EntityIndex以及PrimaryEntityIndex届良。EntityIndex 是依靠哈希表來存儲一組entity來作為值,這就意味著你可以有多個entity在同一個位置上圣猎。PrimaryEntityIndex確保每一個key都是只與一個entity相關(guān)聯(lián)邓深。當你擁有IdComponent并且想用IdComponent來查找Entity的時候营袜,就非常方便了。但你需要存儲一個Entity的引用到另一個Entity中時梨熙,我們也推薦你使用這種方法(更多關(guān)于這方面的會在ingredience 的章節(jié)中說到)爪模。

就像上一段中說到的欠啤,Entitas-CSharp僅僅實現(xiàn)了兩種簡單的Entity Indexing的策略。你可能會需要更多更復(fù)雜的Index來讓你獲取某個范圍內(nèi)的enitity或是擁有一個更為復(fù)雜的Index key屋灌。這種情況下呢洁段,你可以看一看AbstractEntityIndex類。將這本書提供給你的知識融會貫通共郭,你應(yīng)該會非常輕易地理解Index的實現(xiàn)并且寫出自己自定義的Index祠丝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疾呻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子写半,更是在濱河造成了極大的恐慌岸蜗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠蝇,死亡現(xiàn)場離奇詭異璃岳,居然都是意外死亡,警方通過查閱死者的電腦和手機悔捶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門铃慷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕该,你說我怎么就攤上這事犁柜。” “怎么了蛇损?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵赁温,是天一觀的道長。 經(jīng)常有香客問我淤齐,道長股囊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任更啄,我火速辦了婚禮稚疹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祭务。我一直安慰自己内狗,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布义锥。 她就那樣靜靜地躺著柳沙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拌倍。 梳的紋絲不亂的頭發(fā)上赂鲤,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音柱恤,去河邊找鬼数初。 笑死,一個胖子當著我的面吹牛梗顺,可吹牛的內(nèi)容都是我干的泡孩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼寺谤,長吁一口氣:“原來是場噩夢啊……” “哼仑鸥!你這毒婦竟也來了吮播?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤锈候,失蹤者是張志新(化名)和其女友劉穎薄料,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泵琳,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡摄职,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了获列。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷市。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖击孩,靈堂內(nèi)的尸體忽然破棺而出迫悠,到底是詐尸還是另有隱情,我是刑警寧澤巩梢,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布创泄,位于F島的核電站,受9級特大地震影響括蝠,放射性物質(zhì)發(fā)生泄漏鞠抑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一忌警、第九天 我趴在偏房一處隱蔽的房頂上張望搁拙。 院中可真熱鬧,春花似錦法绵、人聲如沸箕速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盐茎。三九已至,卻和暖如春徙赢,著一層夾襖步出監(jiān)牢的瞬間庭呜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工犀忱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扶关。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓阴汇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親节槐。 傳聞我的和親對象是個殘疾皇子搀庶,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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