前言
在寫這篇文章前峡碉,之前有寫過一篇以CocosCreator以subpackages分包實現(xiàn)大廳+子游戲,但以這種方式存在一個問題壹蔓,就是沒有做到實際意義上的大廳+子游戲,官方的說明如下:
配置為子包后咖楣,只有原生資源破讨,例如圖片和音頻會被最終放到子包中喳整。Prefab蜀漆、AnimationClip 等 JSON 類型的資源仍然會放在主包里
這就意味著子包如果在只改變了Prefab慎皱、AnimationClip等JSON類型資源時老虫,按我們的理解是改變了子游戲,更新子游戲子包茫多,但其實這個時候祈匙,是更新大廳,這類生成的資源都包含在主包內(nèi)天揖,而并沒有包含在子包里夺欲。
從v2.4,Creator 正式支持 Asset Bundle 功能宝剖。Asset Bundle 作為資源模塊化工具洁闰,允許開發(fā)者按照項目需求將貼圖、腳本万细、場景等資源劃分在多個 Asset Bundle 中扑眉,然后在游戲運行過程中,按照需求去加載不同的 Asset Bundle赖钞,以減少啟動時需要加載的資源數(shù)量腰素,從而減少首次下載和加載游戲時所需的時間。
Asset Bundle 可以按需求隨意放置雪营,比如可以放在遠程服務(wù)器弓千、本地、或者小游戲平臺的分包中献起。也可以跨項目復(fù)用洋访,用于加載子項目中的 Asset Bundle镣陕。
這個方式,徹底的解決了之前版本的短板姻政,真正意義上的實現(xiàn)了資源及代碼的分包呆抑。
項目環(huán)境
CocosCreator 2.4.0
Microsoft Visual Studio Enterprise 2015(SDK安裝 : Windows Phone SDK 8.0)
Microsoft Visual Code
Android Studio 3.6.3(API Level : android-28 NDK : https://dl.google.com/android/repository/android-ndk-r18b-windows-x86_64.zip)
項目示例
示例Git地址https://github.com/TopDiscover/QuickFramework/tree/2.4.0
項目關(guān)鍵點
1、該方案基于Asset Bundle
2汁展、大廳與子游戲代碼作為同一項目開發(fā)鹊碍,方便對資源及代碼的管理,可有效的解決多項目開發(fā)可能產(chǎn)生uuid重復(fù)問題
3食绿、子游戲之間代碼及資源不能相互引用
4侈咕、大廳與子游戲之間的通信全部以事件方式進行交互
項目結(jié)構(gòu)
大廳與子游戲分別單獨的作為一個整體,結(jié)構(gòu)如下:
紅色區(qū)域
resources目錄為大廳的資源(大廳+公共)
script目錄為大廳的代碼(大廳+公共+框架)
黃色區(qū)域的子游戲器紧,分別配置Bundle,如下:
項目擴展插件使用
1耀销、引擎修正
為了后面使用方便,安裝好你的Creator2.4.0品洛,直接使用引擎修正后树姨,再構(gòu)建項目,對引擎修改的部分會自動生成到你的構(gòu)造項目中桥状,如果你的項目目前已經(jīng)構(gòu)建,對引擎改動的代碼放置在package/engine目錄
下,到該目錄下用對比工具同步到你的項目中硝清,目前還未支持對已經(jīng)生成構(gòu)建的項目進行引擎代碼的修正
2辅斟、資源引用檢測
在游戲開發(fā)過程中,由于某些子游戲相當類似芦拿,所有直接復(fù)制進行修改士飒,此時復(fù)制得到的子游戲的資源引用仍然指向以前的地方,并未指向復(fù)制后得到的資源蔗崎,又或者不小心在A游戲使用了B游戲的資源酵幕,此時在打包完成后,且子游戲都不放置到包內(nèi)缓苛,當通過熱更新子游戲進入時芳撒,由于只下載了B游戲的資源,但B游戲的資源大多都還指向A游戲未桥,此時會造成找不到資源可能產(chǎn)生崩潰的現(xiàn)象笔刹。但當我們游戲的預(yù)置體在足夠多的情況,如果手動的排查冬耿,是一個非常大的工程舌菜,所以這邊提供了一個檢測工具,去檢測你的子游戲預(yù)置體是否使用到了其它子游戲的資源亦镶,如下圖
當你的子游戲做完后日月,可使用插件來檢測完成的子游戲是否引用了其它子游戲的資源袱瓮,控制臺的警告就是你引用了不屬于自己子游戲的資源,需要自己手動去處理掉這些問題
3爱咬、熱更新工具
工具說明
大廳生成Manifest配置
版本號:當前大廳的版本號
資源服務(wù)器地址:cdn資源服務(wù)器地址
build項目資源文件目錄:指定你的build目錄尺借,如
點擊生成會生成版本控制文件如下圖
子游戲生成Manifest配置
目錄只能配置子游戲的游戲版本號
測試環(huán)境一欄
主要關(guān)注本地server物理路徑,可以指定你的服務(wù)器路徑台颠,熱更新相關(guān)文件直接部署到你的服務(wù)器
如我本地服務(wù)器:
點擊部署褐望,最終服務(wù)器部署的資源如下:
執(zhí)行子游戲包剔除:
當你部署完成后,如果不希望把某個子游戲放入到原始包內(nèi)串前,可執(zhí)行這個命令剔除不包含在包內(nèi)的子游戲
4瘫里、擴展插件配置說明
熱更新子游戲及大廳版本的配置及資源檢測插件中顯示的游戲在packages/config/games.json配置,當開發(fā)完成子游戲時荡碾,如果需要對其實資源引用合法性檢測及版本做更新時谨读,直接對games.json進行修改
示例測試
1、構(gòu)建版本
2坛吁、生成熱更新版本控制文件
使用熱更新插件生成熱更新版本控制文件劳殖,并部署到自己的測試服務(wù)器,如下
3拨脉,剔除子游戲
如果希望子游戲在包內(nèi)哆姻,可在【是否包含在原始包內(nèi)】打勾,否則相反
這里測試一個在包內(nèi)一個不再包內(nèi)的情況玫膀,配置如下
4矛缨、win32平臺編譯運行
打開build\jsb-default\frameworks\runtime-src\proj.win32的工程編譯打開游戲如下
左邊為該游戲的工作目錄,目前主包并沒有包含有子游戲的代碼及資源
分別進入兩個子游戲之后帖旨,本地緩存如下箕昭,gameTwo不在包含,下載子游戲 后運行解阅,gameOne在包內(nèi)落竹,由于跟服務(wù)器版本一致,不會下載货抄,直接使用本地資源及代碼
運行游戲1述召,未產(chǎn)生資源代碼的下載,直接使用本地資源代碼
運行游戲2碉熄,下載了服務(wù)器最新資源及代碼如下