|
前幾天寫了《開源分享 Unity3d客戶端與C#分布式服務(wù)端游戲框架》,受到很多人關(guān)注,QQ群幾天就加了80多個(gè)人。開源這個(gè)框架的主要目的也是分享自己設(shè)計(jì)ET的一些想法,所以我準(zhǔn)備寫一系列的文章,介紹下自己的思路跟設(shè)計(jì),每篇一個(gè)主題,這次介紹的是組件設(shè)計(jì)。 在代碼復(fù)用和組織數(shù)據(jù)方面,面向?qū)ο罂赡苁谴蠹业谝环磻?yīng)。面向?qū)ο笕筇匦岳^承,封裝,多態(tài),在一定程度上能解決不少代碼復(fù)用,數(shù)據(jù)復(fù)用的問題。不過面向?qū)ο蟛皇侨f能的,它也有極大的缺陷: 1. 數(shù)據(jù)結(jié)構(gòu)耦合性極強(qiáng)2. 難以熱插拔使用面向?qū)ο罂赡軐?dǎo)致災(zāi)難性后果,游戲開發(fā)中有新人有老人,有技術(shù)好的,有技術(shù)差的。人都是喜歡偷懶的,當(dāng)你發(fā)現(xiàn)調(diào)整繼承關(guān)系麻煩的時(shí)候,有可能AB中增加一個(gè)字段為了省事直接就放到父類D中去了。導(dǎo)致C莫名奇妙的多了一個(gè)無用的字段。關(guān)鍵還沒法發(fā)現(xiàn),最后導(dǎo)致父類D越來越大,到最后有可能干脆就不用ABC了,直接讓所有對(duì)象都變成D,方便嘛!是的,很多游戲就是這么干的,開發(fā)到最后根本就不管繼承關(guān)系了,因?yàn)橄牍芤补懿涣肆恕?/p> 面向?qū)ο笤诿鎸?duì)復(fù)雜的游戲邏輯時(shí)很無力,所以很多游戲開發(fā)者又倒退了回去,使用面向過程進(jìn)行開發(fā)游戲,面向過程,簡單粗暴,不考慮復(fù)雜的繼承,不考慮抽象,不考慮多態(tài),是開發(fā)屆的freestyle,挽起袖子就開擼,但同時(shí),代碼邏輯的復(fù)用性,數(shù)據(jù)的復(fù)用性也大大降低。面向過程也不是一種好的游戲開發(fā)模式。 組件模式很好的解決了面向?qū)ο笠约懊嫦蜻^程的種種缺陷,在游戲客戶端中使用非常廣泛,Unity3d,虛幻4,等等都使用了組件模式。組件模式的特點(diǎn): 但是目前只有極少有服務(wù)端使用了組件的設(shè)計(jì),守望先鋒服務(wù)端應(yīng)該是使用了組件的設(shè)計(jì),守望先鋒的開發(fā)人員稱之為ECS架構(gòu),其實(shí)就是組件模式的一個(gè)變種,E就是Entity,C就是Component,S是System,其實(shí)就是將組件Component的邏輯與數(shù)據(jù)剝離,邏輯部分叫System,話題扯遠(yuǎn)了,還是回到ET框架來把。 ET框架使用了組件的設(shè)計(jì)。一切都是Entity和Component,任何類繼承于Entity都可以掛載組件,例如玩家類: 給玩家對(duì)象掛載個(gè)移動(dòng)組件MoveComponent,這樣玩家就可以移動(dòng)了,給玩家掛上一個(gè)背包組件,玩家就可以管理物品了,給玩家掛上技能組件,那么玩家就可以施放技能了,加上Buff組件就可以管理buff了。 組件是高度可以復(fù)用的,比如一個(gè)NPC,他也可以移動(dòng),給NPC也掛上MoveComponent就行了,有的NPC也可以施放技能,那么給它掛上SpellComponent,NPC不需要背包,那么就不用掛ItemsComponent了 ET框架模塊全部做成了組件的形式,一個(gè)進(jìn)程也是由不同的組件拼接而成。比方說Loginserver需要對(duì)外連接也需要與服務(wù)器內(nèi)部進(jìn)行連接,那么login server掛上 比如battle server就不需要對(duì)外網(wǎng)連接(外網(wǎng)消息由gateserver轉(zhuǎn)發(fā)),那么很自然的只需要掛載一個(gè)內(nèi)網(wǎng)組件即可。 這樣,NetInnerComponent在AddComponent之后會(huì)調(diào)用其Awake方法,并且每幀調(diào)用Update方法。 組件式開發(fā)最大的好處就是不管菜鳥還是高手,開發(fā)一個(gè)功能都能很快的知道怎么組織數(shù)據(jù)怎么組織邏輯??梢酝耆艞壝嫦?qū)ο?。使用面向?qū)ο箝_發(fā)最頭疼的就是我該繼承哪個(gè)類呢?之前做過最恐怖的就是虛幻三,虛幻三的繼承結(jié)構(gòu)非常多層,完全不知道自己需要從哪里開始繼承。最后可能導(dǎo)致一個(gè)非常小的功能,繼承了一個(gè)及其巨大的類,這在虛幻三開發(fā)中屢見不鮮。所以虛幻4改用了組件模式。組件模式的模塊隔離性非常好,技術(shù)菜鳥某個(gè)組件寫得非常差,也不會(huì)影響到其它模塊,大不了重寫這個(gè)組件就好了。 正是因?yàn)镋T使用了可拆卸的組件模式,ET可以將所有服務(wù)器組件都裝到同一個(gè)進(jìn)程上,那么這一個(gè)進(jìn)程就可以當(dāng)作一組分布式服務(wù)器使用。從此用vs調(diào)試分布式服務(wù)器成為了可能。正因?yàn)檫@樣,平常開發(fā)只使用一個(gè)進(jìn)程,發(fā)布的時(shí)候發(fā)布成多個(gè)進(jìn)程就行了。說實(shí)在的,不是吹牛,這是一個(gè)偉大的發(fā)明,這一發(fā)明解決了分布式游戲服務(wù)器開發(fā)中的大大大難題,極大的提高了開發(fā)效率。 |
|
|