點擊上方<font color=blue>億元程序員</font>+關注和<font color=orange>★</font>星標
引言
哈嘍大家好,無論是個人的小遊戲項目還是公司的商業遊戲項目,通常都會進行多平台分發。
例如個人小遊戲可以上架微信小遊戲、抖音小遊戲,公司的商業遊戲除了可以上架前面兩個平台外,還可以上架渠道(OV華)、AppStore等等。
遊戲要上架不同的平台,意味着要接入不同的SDK,特別在遊戲快要不行的時候,嘗試更多平台(bt、0.1等等),久而久之,對接不同平台/渠道的代碼會越來越多。
事實上,某個平台/渠道的接入代碼,只有對應的那份代碼才會有用,其他的都是多餘的,所以我們可以考慮把多餘的代碼根據不同的平台進行裁剪。
上面是隔壁Unity通過宏定義的方式,對代碼進行裁剪,針對不同的平台、版本寫不同的代碼進行兼容。其實在Creator裏面也有的,很多人都不知道。
言歸正傳,本期帶大家一起來看看,如何在Cocos遊戲開發中,自定義插件根據不同平台利用宏定義裁剪代碼。
本文源工程可在文末獲取,小夥伴們自行前往。
什麼是宏定義?
相信小夥伴們剛接觸編程時,學過C語言的都瞭解宏定義:
宏定義(macro)是編程語言中一種預處理機制。
例如#define ; ;(舉個例子活躍下氣氛,這樣寫是不對的),正確的用法如下#define MAX(a,b) ((a)>(b)?(a):(b)),將比較大小的方法用MAX代替。
與宏定義密切相關的是條件編譯。
什麼是條件編譯?
條件編譯是根據預定義的條件,在編譯階段選擇性地包含或排除一部分源代碼。編譯器只會編譯那些滿足條件的代碼塊,而忽略不滿足條件的部分。
條件編譯需要基於某些“條件”來做決定,這些條件通常就是是否定義了某個宏,或者宏的值是什麼。
通俗地理解就是,不符合宏定義內的代碼,會在編譯後"刪掉"。
例如C語言中根據不同操作系統輸出不同的內容。
#ifdef _WIN32
printf("Running on Windows.\n");
#elif __linux__
printf("Running on Linux.\n");
#endif
又如Unity中的自帶的編輯器、不同平台的宏。
#if UNITY_EDITOR
// Unity 編輯器內運行
#endif
#if UNITY_IOS
// iOS 平台
#elif UNITY_ANDROID
// Android 平台
#endif
那Creator呢?
Creator中的宏定義
Creator中的宏定義可以通過菜單項目->項目設置->宏配置打開面板進行編輯(CRUD)。
如圖我們定義了ANDROID、DEBUG、LOG三個宏,打鈎後表示該宏生效,根據實際要求打鈎即可。
使用方法如下:
- 通過
import { ANDROID, LOG, DEBUG } from 'cc/userland/macro';
引入對應的宏。
- 通過常規的
if、else判斷即可,編譯後只會保留符合條件分支內的代碼。
自定義插件裁剪代碼實例
要實現在不同的平台,激活不同的宏,保留指定的代碼,我們需要動態地改變宏的值。
實例通過自定義插件來實現。
1.創建插件
首先要創建我們的插件,通過菜單擴展->創建擴展打開擴展創建面板,選擇構建插件,並且通過擴展管理器啓用插件。
2.擴展構建面板
在builder.ts中,刪除不需要的代碼,添加一個自定義宏的輸入框,用於不同的平台輸入指定的宏,用;隔開。
效果如下:
3.插件整體流程
開始—>構建前解析面板輸入的宏->讀取已有宏配置->修改激活對應的宏->保存新的宏配置->構建->構建後恢復對應的宏->結束
- 構建前處理:在
onBeforeBuild中進行構建前處理。
- 解析輸入的宏:
- 讀取已有宏配置,配置在文件
settings\v2\packages\engine.json,通過fs模塊讀取內容:
- 內容在
macroCustom字段中,大致如下:
- 修改激活對應的宏:
- 保存新的宏配置:通過
await Editor.Message.request('project', 'set-config', 'engine', 'macroCustom', engineConfig.macroCustom);消息進行保存。
- 構建後恢復宏配置:為了避免構建後宏影響了其他平台,我們需要將對應的宏進行恢復:
4.效果演示
在插件目錄,安裝依賴npm install和構建插件npm run build。
新建android平台,自定義宏中輸入ANDROID;DEBUG;LOG。
新建web平台,自定義宏中輸入DEBUG;LOG。
分別進行構建:
構建完可以看到,只保留了對應宏內的代碼,if、else都剔除了:
android:
web:
結語
Creator裏面這個裁剪代碼的功能真的很好用。
小夥伴們覺得如何呢?
本期完整示例工程可以通過閲讀原文獲取,這不僅是知識的獲取,更是對筆者的支持和認可,感謝支持!
我是"億元程序員",一位有着8年遊戲行業經驗的主程。在遊戲開發中,希望能給到您幫助, 也希望通過您能幫助到大家。
AD:筆者線上的小遊戲《打螺絲闖關》《貪吃蛇掌機經典》《重力迷宮球》《填色之旅》《方塊掌機經典》大家可以自行點擊搜索體驗。
實不相瞞,想要個贊和愛心!請把該文章分享給你覺得有需要的其他小夥伴。謝謝!
推薦專欄:
知識付費專欄
你知道和不知道的微信小遊戲常用API整理,趕緊收藏用起來~
100個Cocos實例
8年主程手把手打造Cocos獨立遊戲開發框架
和8年遊戲主程一起學習設計模式
從零開始開發貪吃蛇小遊戲到上線系列
點擊下方<font color=gray>灰色按鈕</font>+關注。