unity項(xiàng)目中的程序集劃分--設(shè)計(jì)思想和具體操作

1. 劃分程序集的意義

在大型項(xiàng)目中辫诅,合理的規(guī)劃和拆分代碼模塊岭妖,設(shè)置合理的引用關(guān)系函喉,可以解除基礎(chǔ)框架-游戲模塊-三方插件的耦合呜舒。


圖2. 普通的項(xiàng)目的程序集劃分

如上圖中游戲模塊作為需要經(jīng)常改動(dòng)的模塊锭汛,它引用了基礎(chǔ)框架模塊和三方插件。而后者沒有對(duì)其的引用袭蝗。

如果按上圖劃分程序集并設(shè)置引用關(guān)系:代碼的依賴關(guān)系會(huì)因?yàn)槌绦蚣蕾嚤粡?qiáng)制限制唤殴。如果某個(gè)不規(guī)范的程序員擅自在基礎(chǔ)框架中添加了涉及到游戲模塊的代碼,那么Ta會(huì)發(fā)現(xiàn)代碼報(bào)錯(cuò)到腥,編輯器無法在基礎(chǔ)框架程序集中查到對(duì)游戲模塊程序集的代碼的引用朵逝。

如果基礎(chǔ)框架和游戲模塊同在同一個(gè)程序集中:代碼的依賴關(guān)系必須要靠個(gè)人的代碼能力管理。作為管理者必須要嚴(yán)格規(guī)范下屬并經(jīng)常review代碼乡范,不然不規(guī)范的下屬幾天就可能把基礎(chǔ)框架和游戲模塊揉合成一團(tuán)小貓玩過的毛線團(tuán)配名,很難理順啤咽!

2. 程序集與熱更新

在熱更新需求下的程序集劃分與普通的項(xiàng)目差別很小,基本通用渠脉,主要在于我們?nèi)绾蝿澐諥OT程序集和JIT程序集宇整,而且還有對(duì)于unity默認(rèn)的Assembly-CSharp程序集的定義。

例如上面的圖片中的例子芋膘,我們可以有2種劃分方案

  1. AOT程序集包括基礎(chǔ)框架模塊和三方插件鳞青,熱更程序集包括游戲模塊的1~N個(gè)程序集。這種方案下適用于基礎(chǔ)框架穩(wěn)固完善的項(xiàng)目为朋,因?yàn)榛A(chǔ)框架不會(huì)有大的變動(dòng)所以不需要頻繁更新整包臂拓;

  2. AOT程序集僅包括三方插件(甚至三方插件也可以不包括),剩余所有的程序集作為熱更习寸。這種方案下基本所有內(nèi)容都可以熱更埃儿,適用于新項(xiàng)目的快速迭代。

但是劃分方案2中融涣,有個(gè)問題:

  • 下載/加載ab資源等操作童番,是在需要熱更的基礎(chǔ)框架中;
  • 加載熱更資源和加載dll等初始化操作威鹿,是在AOT程序集中剃斧,且會(huì)用到下載/加載ab資源代碼;

所以在上面的幾條前提下忽你,我們發(fā)現(xiàn)這種劃分方案下:AOT程序集中有很多對(duì)熱更程序集中代碼的調(diào)用幼东。
我們可以通過Assembly加載,通過反射調(diào)用到熱更的代碼科雳,但是這樣必然很繁瑣根蟹。還有另外一種方法,為了避免AOT引用熱更代碼糟秘,我們也可以在AOT中實(shí)現(xiàn)另外一套資源下載/加載邏輯简逮。當(dāng)然這2種方法都很麻煩,最好還是基礎(chǔ)框架的代碼(至少下載/加載ab資源的代碼)設(shè)置為AOT程序集尿赚。

3 Assembly-CSharp程序集

在上述2種方案中散庶,我們都要考慮一個(gè)特殊的程序集:unity默認(rèn)的Assembly-CSharp程序集
如果自己添加的代碼凌净,如果沒有專門劃分程序集悲龟,那么就會(huì)被設(shè)置為默認(rèn)的Assembly-CSharpAssembly-CSharp-Editor程序集。

3.1 默認(rèn)程序集的特殊之處

不確定性和混沌性:自定義的程序集必定包含在某個(gè)專屬的文件夾下或dll中冰寻,但是默認(rèn)程序集的代碼遍布整個(gè)項(xiàng)目目錄须教,藏于各個(gè)犄角旮旯之中,不便管理和統(tǒng)計(jì)斩芭。
擁有最大訪問權(quán)力:自定義的程序集需要設(shè)置對(duì)外部程序集的引用后轻腺,才可以在內(nèi)部使用相關(guān)的接口代碼羹奉。但是默認(rèn)程序集可以訪問項(xiàng)目內(nèi)所有的程序集(在勾選Auto Referenced的時(shí)候),它相當(dāng)于是處于程序集引用關(guān)系的金字塔頂部约计。

3.2 熱更中默認(rèn)程序集是否熱更诀拭?

以下兩種方案都可以,但是各有利弊:

  • 我們可以將其定義為AOT程序集煤蚌,不引用任何熱更程序集耕挨,那么下載熱更資源,加載dll等操作均在這里實(shí)現(xiàn)尉桩。
  • 我們也可以將其定義為熱更程序集筒占,那么下載熱更資源,加載dll等操作均在劃分的其他AOT程序集中實(shí)現(xiàn)蜘犁。

把Assembly-CSharp程序集當(dāng)作熱更程序集有個(gè)不好的地方翰苫,那便是我們隨意加入的測(cè)試代碼(沒有放在有程序集定義的文件夾下),某些導(dǎo)入的三方插件等等这橙,只要未定義過程序集奏窑,那么默認(rèn)就會(huì)加入到Assembly-CSharp程序集。所以會(huì)經(jīng)常誤把某些代碼打入熱更dll屈扎。為避免程序花費(fèi)時(shí)間和精力去檢查這些內(nèi)容埃唯,不建議用這種方案。

4. unity中如何劃分程序集

在一個(gè)普通的C#項(xiàng)目中鹰晨,我們可以在vs中右鍵程序集(項(xiàng)目)條目然后打開屬性墨叛,查看該程序集的相關(guān)設(shè)定。但是unity生成的項(xiàng)目中模蜡,我們是無法使用這個(gè)操作的漠趁。

因?yàn)槌绦蚣纳珊蛣澐质怯晌覀冊(cè)趗nity中處理,然后unity自動(dòng)生成忍疾。其中unity中用來劃分程序集的文件就是Assembly Definition闯传。
當(dāng)我們?cè)谀夸浿杏益I創(chuàng)建Assembly Definition 文件后,該目錄內(nèi)的所有代碼文件將被劃分為當(dāng)前定義的程序集膝昆。

我們通過Assembly Definition文件丸边,可以處理以下事情:

  1. 添加自定義的宏:Define Constraints;
  2. 添加刪除程序集的依賴:Assembly Definition Refercences;
  3. 選擇生效的平臺(tái):Platforms;

除了上面這些常用的功能,還有General選項(xiàng)下這些很有用的選項(xiàng):

  1. Allow ‘unsafe’ Code:是否啟用不安全的代碼荚孵;
  2. Auto Referenced:是否自動(dòng)被依賴;勾選后會(huì)被默認(rèn)的Assembly-CSharp程序集自動(dòng)依賴纬朝。所以如果我們想在Assembly-CSharp中隔離對(duì)當(dāng)前程序集的依賴收叶,取消勾選。
  3. No Engine References:不依賴于引擎提供的代碼模塊共苛。適用于可以在unity或其他平臺(tái)的項(xiàng)目中通用的程序集判没。
  4. Override References:可以手動(dòng)指定所依賴的預(yù)編譯的程序集蜓萄,因?yàn)閡nity項(xiàng)目中的預(yù)編譯程序集可以被其他默認(rèn)依賴,勾選后當(dāng)前程序集可以選擇(不)依賴某個(gè)預(yù)編譯的程序集澄峰。
  5. Root Namespace: 當(dāng)前程序集的默認(rèn)命名空間嫉沽,填寫后我們使用unity添加新代碼文件,會(huì)自動(dòng)添加命名空間俏竞。我測(cè)試只有在unity中創(chuàng)建才生效绸硕。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市魂毁,隨后出現(xiàn)的幾起案子玻佩,更是在濱河造成了極大的恐慌,老刑警劉巖席楚,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咬崔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烦秩,警方通過查閱死者的電腦和手機(jī)垮斯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來只祠,“玉大人甚脉,你說我怎么就攤上這事∶” “怎么了牺氨?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墩剖。 經(jīng)常有香客問我猴凹,道長,這世上最難降的妖魔是什么岭皂? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任郊霎,我火速辦了婚禮,結(jié)果婚禮上爷绘,老公的妹妹穿的比我還像新娘书劝。我一直安慰自己,他們只是感情好土至,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布购对。 她就那樣靜靜地躺著,像睡著了一般陶因。 火紅的嫁衣襯著肌膚如雪骡苞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音解幽,去河邊找鬼贴见。 笑死,一個(gè)胖子當(dāng)著我的面吹牛躲株,可吹牛的內(nèi)容都是我干的片部。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霜定,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼档悠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起然爆,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤站粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后曾雕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奴烙,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剖张,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了切诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搔弄,死狀恐怖幅虑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顾犹,我是刑警寧澤倒庵,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站炫刷,受9級(jí)特大地震影響擎宝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浑玛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一绍申、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顾彰,春花似錦极阅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灰伟,卻和暖如春拆又,著一層夾襖步出監(jiān)牢的瞬間儒旬,已是汗流浹背栏账。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工帖族, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挡爵。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓竖般,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茶鹃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涣雕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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