点击上方亿元程序员+关注和★星标
引言
哈喽大家好,无论是个人的小游戏项目还是公司的商业游戏项目,通常都会进行多平台分发。
例如 个人小游戏可以上架微信小游戏、抖音小游戏,公司的商业游戏除了可以上架前面两个平台外,还可以上架渠道(OV华)、AppStore等等。
游戏 要上架不同的平台,意味着要接入不同的SDK,特别在游戏快要不行的时候,尝试更多平台(bt、0.1等等),久而久之,对接不同平台/渠道的代码会越来越多。
事实上,某个平台/渠道的接入代码,只有对应的那份代码才会有用,其他的都是多余的,所以我们可以考虑把多余的代码根据不同的平台进行裁剪。

上面 是隔壁Unity通过宏定义的方式,对代码进行裁剪,针对不同的平台、版本写不同的代码进行兼容。其实在Creator里面也有的,很多人都不知道。
言归正传 ,本期带大家一起来看看,如何在Cocos游戏开发中,自定义插件根据不同平台利用宏定义裁剪代码。
本文源工程可在文末获取,小伙伴们自行前往。
什么是宏定义?
相信 小伙伴们刚接触编程时,学过C语言的都了解宏定义:
宏定义(macro)是编程语言中一种预处理机制。
例如 #define ; ;(举个例子活跃下气氛,这样写是不对的),正确的用法如下#define MAX(a,b) ((a)>(b)?(a):(b)),将比较大小的方法用MAX代替。
与宏定义密切相关的是条件编译。
什么是条件编译?
条件编译是根据预定义的条件,在编译阶段选择性地包含或排除一部分源代码。编译器只会编译那些满足条件的代码块,而忽略不满足条件的部分。
条件编译需要基于某些"条件"来做决定,这些条件通常就是是否定义了某个宏,或者宏的值是什么。
通俗地理解就是,不符合宏定义内的代码,会在编译后"删掉"。
例如 C语言中根据不同操作系统输出不同的内容。
c
#ifdef _WIN32
printf("Running on Windows.\n");
#elif __linux__
printf("Running on Linux.\n");
#endif
又如 Unity中的自带的编辑器、不同平台的宏。
c#
#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:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。
实不相瞒,想要个赞 和爱心 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!
推荐专栏:
点击下方灰色按钮+关注。