CocosCreator神技——用宏剔除不用的代码

背景

我们是不是习惯将一些常用的东西都归纳总结起来,做成一个框架,方便后续项目的复用,形成自己的“框架”,但是随着时间的迁移,这个框架会越来越“臃肿”,那我们有什么办法解决这个问题呢?

方案

一般针对这种情况,各种编辑器会有两种做法

直接剔除“无用”资源

无用的意思是编辑器检测到没有“引用”,比如CocosCreator(后面称CC)对非动态引用的资源剔除方案,比如AndroidStuiod(后面称AS)的shrinkResources配置。

[PS1: 因为Cocos打包后的资源都不是通过Android本身直接引用的,所以这个字段在Cocos的安卓工程中应该要配置为false)。]

值得注意的是,AS中的代码混淆(minifyEnabled),不但会混淆方法,而且也会将无用的代码剔除,所以如果是通过反射调用的代码,我们也要进行混淆剔除。

[PS2: 比如在CocosCreator 中用callStaticMethod方法通过反射方式js调用java代码,那么我们要么不启用混淆,要么将混淆的方法写到proguard-rules.pro文件中]

通过宏来剔除代码

这类比较常见在c++、oc语言中,比如iOS工程在XCode中,通过Preprocessor Macros设置宏。

因为CC已经支持资源剔除了,那么,代码上我们有什么办法剔除呢?从方案来讲,如果使用方案一,感觉更省力,但是考虑js的特性,很难做到这种效果,那么CC是怎么做的呢?

CocosCreator的方案

是的,CC选择的是宏的方式,这种方式与webpack其实是一致的,但是在CC3.0以前,只有官方内置的宏(主要是平台宏),其实是无法满足我们的需求的,但是在CC3.x,开放了自定义宏的方式,这种对我们就简单多了,下面介绍CC的使用方式

步骤一

从顶部项目菜单打开项目设置,选择宏配置,然后添加自定义宏,比如我定义一个宏为CUSTOM_TEST,如果要启用该宏,打钩即可。如下

image

步骤二

在代码中,用ifelse判断即可,编译时编辑器会自动剔除代码。如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { _decorator, Component, Node } from 'cc';
import { CUSTOM_TEST } from 'cc/userland/macro';
const { ccclass, property } = _decorator;

@ccclass('Test')
export class Test extends Component {
start() {

if (CUSTOM_TEST) {
// TODO 宏开启要做的事
} else {
// TODO 宏关闭要做的事
}
}

}

这样就结束了~

[PS3: CC的宏配置保存在settings/v2/packages/engine.json文件的macroCustom字段中,可以写一个插件控制该字段]

结尾

本次分享的功能极其简单,只是在相关技术群讨论时,感觉很多人还没用过甚至不知道,所以分享出来

[PS4: 3.8.0可能存在问题,没有用过该版本,3.8.1内测的时候发现该版本的自定义宏存在问题,反馈给官方人员修复]