其实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)。

如图 我们定义了ANDROIDDEBUGLOG三个宏,打钩后表示该宏生效,根据实际要求打钩即可。

使用方法如下:

  • 通过import { ANDROID, LOG, DEBUG } from 'cc/userland/macro'; 引入对应的宏。

  • 通过常规的ifelse判断即可,编译后只会保留符合条件分支内的代码。

自定义插件裁剪代码实例

要实现在不同的平台,激活不同的宏,保留指定的代码,我们需要动态地改变宏的值。

实例通过自定义插件来实现。

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年游戏主程一起学习设计模式

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

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

相关推荐
东风破_4 小时前
Docker 基础:为什么需要容器?
前端·后端·nginx
东风破_4 小时前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
你别说话了5 小时前
Vue项目解决跨域
前端·javascript·vue.js
唐青枫5 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
网安蟹佬霸6 小时前
OSINT开源情报收集实战:从信息搜集到资产测绘(2026最新万字保姆级指南)
前端·网络·安全·web安全·网络安全·开源
a1117766 小时前
3D历史建筑展览馆 THreeJS 开源
前端·开源
单线程_016 小时前
【源码阅读】Vue3 Tokenizer 词法分析器完整状态机流转深度梳理(3.4+ 新版架构)
前端
PBitW6 小时前
PM 丢来 3 个 Excel、12 个功能、4 种情形?用 TRAE Work 30 分钟整理成前端开发文档
前端·trae
风骏时光牛马9 小时前
AIAgent高可用架构:弹性容错与故障自愈的落地实践
前端
IT_陈寒9 小时前
Vue的响应式什么时候会失灵?这个坑我踩了
前端·人工智能·后端