轉載自:https://www.jianshu.com/p/efee9f5937a3
前言
隨着遊戲的玩法越來越多,也就意味着包體越來越大,對於玩家來說,首次下載的包體就會越來越大,從而也會增加首次啓動的時間,在未推出分包功能之前,所有的代碼都會生成到一個project.js的文件中,此時對於我們開發者迫切希望把遊戲一些比較獨立的模塊的代碼及資源分開來進行加載,由於公司做的是棋牌遊戲,一個從零開始的新項目,當時CocosCreator2.1.2的最新版本,所以就直接用了最新版本做項目,做之前框架也是朝着大廳+子游戲的方向,看了不少論談,多數的做法就是大廳與子游戲分開項目進行開發,但個人覺得對項目代碼及資源上的管理特別的不方便,在這項目立項之前對當前Creator版本的功能做了大致的瞭解,發現自從v2.0.7版本就已經開始支持分包處理,但v2.1.2版本,由於引擎對自己引擎資源的管理有問題,所以寫這個文檔就以最新版本v2.3.3來做的,但2.1.2之後的版本本人確定是沒有問題的,只是需要對引擎進行一些修改
項目環境
CocosCreator 2.3.3
Microsoft Visual Studio Enterprise 2015(SDK安裝 : Windows Phone SDK 8.0)
Microsoft Visual Code
Android Studio 3.6.3(API Level : android-28 NDK : android-ndk-r16b)
項目示例
項目關鍵點
1.該方案基於CocosCreator分包功能
2.大廳與子游戲代碼作爲同一項目開發,方便對資源及代碼的管理,可有效的解決多項目開發可能產生uuid重複問題
3.子游戲之間代碼及資源不能相互引用
4.大廳與子游戲之間的通信全部以事件方式進行交互
項目結構
把項目大致分爲資源區+代碼區
資源區及代碼區的結構一致
大廳(大廳+公共+框架)+子游戲的形式,如下圖,紅包爲大廳部分,黃色爲子游戲部分
項目結構
紅包大廳部分,無需配置爲子包,黃色子游戲部分,需要配置成子包。
需要注意的事,子游戲代碼及資源子包名配置一致,如下圖
遊戲1資源
遊戲1代碼
項目擴展插件使用
項目工具
1.引擎修正
爲了後面使用方便,安裝好你的Creator2.3.3,直接使用引擎修正後,再構建項目,對引擎修改的部分會自動生成到你的構造項目中,如果你的項目目前已經構建,對引擎改動的代碼放置在package/engine目錄下,到該目錄下用對比工具同步到你的項目中,目前還未支持對已經生成構建的項目進行引擎代碼的修正
2.資源引用檢測
在遊戲開發過程中,由於某些子游戲相當類似,所有直接複製進行修改,此時複製得到的子游戲的資源引用仍然指向以前的地方,並未指向複製後得到的資源,又或者不小心在A遊戲使用了B遊戲的資源,此時在打包完成後,且子游戲都不放置到包內,當通過熱更新子游戲進入時,由於只下載了B遊戲的資源,但B遊戲的資源大多都還指向A遊戲,此時會造成找不到資源可能產生崩潰的現象。但當我們遊戲的預置體在足夠多的情況,如果手動的排查,是一個非常大的工程,所以這邊提供了一個檢測工具,去檢測你的子游戲預置體是否使用到了其它子游戲的資源,如下圖
image.png
當你的子游戲做完後,可使用插件來檢測完成的子游戲是否引用了其它子游戲的資源,控制檯的警告就是你引用了不屬於自己子游戲的資源,需要自己手動去處理掉這些問題
對於代碼中使用資源問題,全部通過路徑代理去獲取子游戲的資源
如進入子游戲,打開子游戲1的界面,界面對視圖預置體路徑的引用如下:
image.png
統一使用這種方式,如果路徑的代理沒有正確設置,能在第一時間確定問題。是不是資源路徑獲取錯誤,還是進入子游戲的相關參數有誤,不至於找不到子游戲的資源。
3.熱更新工具
熱更新工具
工具說明
大廳生成Manifest配置
版本號:當前大廳的版本號
資源服務器地址:cdn資源服務器地址
build項目資源文件目錄:指定你的build目錄,如
image.png
點擊生成會生成版本控制文件如下圖
image.png
image.png
子游戲生成Manifest配置
目錄只能配置子游戲的遊戲版本號
測試環境一欄
主要關注本地server物理路徑,可以指定你的服務器路徑,熱更新相關文件直接部署到你的服務器
如我本地服務器:
D:/nginx-1.17.10/html/hotupdate
點擊部署,最終服務器部署的資源如下
image.png
執行子游戲包剔除:
當你部署完成後,如果不希望把某個子游戲放入到原始包內,可執行這個命令剔除不包含在包內的子游戲
4.擴展插件配置說明
熱更新子游戲及大廳版本的配置及資源檢測插件中顯示的遊戲在packages/config/games.json配置,當開法完成子游戲時,如果需要對其實資源引用合法性檢測及版本做更新時,直接對games.json進行修改
示例測試
1.構建
image.png
2.生成熱更新版本控制文件
使用熱更新插件生成熱更新版本控制文件,並部署到自己的測試服務器,如下
image.png
3,剔除子游戲
如果希望子游戲在包內,可在【是否包含在原始包內】打勾,否則相反
這裏測試一個在包內一個不再包內的情況,配置如下
image.png
4.win32平臺
打開build\jsb-default\frameworks\runtime-src\proj.win32的工程編譯打開遊戲如下
image.png
左邊爲該遊戲的工作目錄,目前主包並沒有包含有子游戲的代碼及資源
分別進入兩個子游戲之後,本地緩存如下,gameTwo不在包含,下載子游戲 後運行,gameOne在包內,由於跟服務器版本一致,不會下載,直接使用本地資源及代碼
image.png
5.android平臺
與win32平臺一致,打包運行就ok