現在負責的一個運營中的商業項目,使用的是 cocosCreator1.8,之前沒有做好設計,所以東西都是直接加載在內存中的,到了現在性能問題逐漸暴露出來,討論之后想進行引擎升級,升級到cocosCreator 2.4。
官方的升級文檔:
1.10以后的資源升級 https://docs.cocos.com/creator/2.4/manual/zh/release-notes/raw-asset-migration.html
2.0 升級 https://docs.cocos.com/creator/2.4/manual/zh/release-notes/upgrade-guide-v2.0.html
2.x 相對于 1.x 核心仍然使用的是 cocos2dx,只是在js部分有了一些改動,所以升級應該是沒有大問題,但是小問題仍然是有不少,這里我們計劃按照:項目能跑起來、打包APK進行全量的玩法測試、有端渠道進行發布、小游戲渠道發布。
升級遇到的問題
1.文本的問題
文本設置了Line Height 之后 會發現 Node 的高度比這個值要大一些,1.8版本就沒有這個問題。據說是因為TTF紋理的會有點偏移,引擎組為了矯正位置加上了偏移,然后對Node的高度進行放大。這里有兩個參數,修改一下即可:
// text_utils.js
-let _BASELINE_RATIO = 0.26;
-let _BASELINE_OFFSET = 0;
+let _BASELINE_RATIO = 0; //0.26;
+let _BASELINE_OFFSET = -0.13;
參考1:解決字體本身攜帶的向上/向下偏移量問題
參考2: 2.1.2版本label的size不可編輯且固定都是FontSize的1.26倍,是故意設計成這樣的么?
參考3: 3.3RichText問題
之前代碼中有設置 文本string 然后依賴節點的size進行判斷的代碼,升級后不生效了,因為新版本不會在設置完后立刻進行更新,如果有類似的邏輯,需要手動先調用cc.Label的 _forceUpdateRenderData()
;
2.EditBox
升級后功能失效,無法點擊,是因為新版本 EditBox的子節點Size有問題,我這里代碼里直接打補丁把所有都處理一下:
let setupEditBoxWidget = function(node) {let textWidget = node.getComponent(cc.Widget);if (!textWidget) {textWidget = node.addComponent(cc.Widget);textWidget.isAlignTop = true;textWidget.top = 0;textWidget.isAlignBottom = true;textWidget.bottom = 0;textWidget.isAlignLeft = true;textWidget.left = 0;textWidget.isAlignRight = true;textWidget.right = 0;textWidget.updateAlignment();}
}
let oldOnEnable = cc.EditBox.prototype.onEnable
cc.EditBox.prototype.onEnable = function(){oldOnEnable.call(this);setupEditBoxWidget(this.textLabel);setupEditBoxWidget(this.placeholderLabel);
}
3.rotation
這個新版本推薦使用angle 代替 rotation,其中 angle = -rotation; 即之前rotation > 0 是順時針旋轉,而angle >0 是逆時針旋轉。這里比較坑的是編輯器里是按照angle的邏輯來的但key顯示的卻是Rotation。
4.event
這個官方文檔里有提到:
// **v1.x**
eventTarget.on(type, function (event) {// 通過 event.detail 獲取 emit 時傳遞的參數
});
eventTarget.emit(type, message); // message 會被保存在回調函數的 event 參數的 detail 屬性上// **v2.0**
eventTarget.on(type, function (message, target) {// 直接通過回調參數來獲取 emit 時傳遞的事件參數
});
eventTarget.emit(type, message, eventTarget); // emit 時可以傳遞至多五個額外參數,都會被扁平的直接傳遞給回調函數
- camera
這個官方文檔之前也有提到,之前是給camera 設置targets, 現在需要通過Mask來實現。這個需要新增一個分組,camera改動比較大,可能業務邏輯也需要修改。
6.shader
一般游戲都會用到變灰之類的shader,需要改成使用material,CCButton里有變灰效果的邏輯可以參考一下
一些廢棄的接口 按照報錯處理掉就行了,其中cc.p用的地方太多了,直接重新定義一下: cc.p = cc.v2;
還有一個是 1.8版本的prefab 如果 js腳本/spriteFrame 等丟失,會有warning,但可以運行,新版本會直接無法實例話對應的prefab,需要刪除掉那些無效的引用。