其实Creator里面这个裁剪代码的功能很好用,建议试试

点击上方亿元程序员+关注和★星标

引言

哈喽大家好,无论是个人的小游戏项目还是公司的商业游戏项目,通常都会进行多平台分发。

例如 个人小游戏可以上架微信小游戏、抖音小游戏,公司的商业游戏除了可以上架前面两个平台外,还可以上架渠道(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:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。

实不相瞒,想要个赞 和爱心 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

点击下方灰色按钮+关注。

相关推荐
TheITSea37 分钟前
JavaScript Web APIs
开发语言·前端·javascript
恋猫de小郭1 小时前
Android CLI 支持 AI Agent 通过 Device Streaming 调试云真机
android·前端·flutter
Wang's Blog1 小时前
Java 项目实战: 外卖平台优化-前端dist部署与Nginx反向代理rewrite
java·前端·nginx
鬓戈1 小时前
Claude Code frontend-design 插件调研 与 Vue 旧系统风格一致性方案
前端·vue.js·人工智能
IT_陈寒1 小时前
SpringBoot自动配置的坑我帮你踩过了
前端·人工智能·后端
其实防守也摸鱼1 小时前
网安自测题:掌握核心知识点的实用练习
linux·运维·服务器·前端·数据库·sql·xss
geovindu4 小时前
css: Timeline scribble
前端·css·iphone
沙漠之主12 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
hasty12 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
Csvn12 小时前
diff 算法(虚拟 DOM Reconciliation)
前端