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

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

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

相关推荐
感谢地心引力1 小时前
【Chrome-Edge-Firefox】浏览器插件开发
前端·chrome·edge·firefox
qq_296544651 小时前
安卓版Google(谷歌地球),安卓谷歌(Google)地图,谷歌翻译,谷歌(Chrome)浏览器,手机版Edge,浏览器等安卓版浏览器下载
前端·chrome
今天也想MK代码1 小时前
JS 注入机制深度解析
java·前端·javascript
一字白首1 小时前
Vue 进阶,指令补充 + computed+watch
前端·javascript·vue.js
暮之沧蓝1 小时前
React(18-19)总结
前端·react.js·前端框架
HIT_Weston1 小时前
50、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(二)
前端·ubuntu·gitlab
我太想进步了C~~1 小时前
Prompt Design(提示词工程)入门级了解
前端·人工智能·算法
crary,记忆1 小时前
如何理解 React的UI渲染
前端·react.js·ui·前端框架
苏打水com1 小时前
Day1-3 夯实基础:HTML 语义化 + CSS 布局实战(对标职场 “页面结构搭建” 核心需求)
前端·css·html·js