C#Unity

在Unity中利用宏来将不同的模块完全分离

Spread the love

在一些开源项目当中,或许有多个模块可以提供给用户选择,举个例子,就在我自己编写的库当中就有很多选项:

每一个模块都负责着各自的功能。
但是有些时候不同的模块之间依旧会产生引用。
例如:在多语言模块当中,我有一个UI组件是放在UGUI模块当中的,但是多语言数据模块则是放在了DataGener模块当中。
这两个模块如果有一个不存在,那么这个功能就会出现报错的情况。
我并不想将这两个模块合并为一个,那么这个时候就轮到宏登场了。

我们都知道,在自定义组件在编辑器的界面时需要重写Editor类中的OnInspectorGUI函数。
那么当可以使用多语言模块与不可使用多语言模块时的显示方式又是不一样的。

当有模块可用的时候:

而模块不可用的时候则会提醒你导入数据模块:

在代码中则展示为:

每当我导入模块的时候,我会将宏定义写入到当前UnityEditor当中去:
获取或者设置当前Unity中的宏主要就是两个方法:

C#
PlayerSettings.GetScriptingDefineSymbolsForGroup
PlayerSettings.SetScriptingDefineSymbolsForGroup

当我点下Apply的时候,我会将我所需的宏写入到当前的Unity当中,而将不需要的去除。
只要宏与代码保持同步,那么我们的代码块就永远不会因为依赖的其他模块的代码缺失而无法使用了。

如果想知道现在的Unity中应用了哪些宏可以直接在PlayerSetting->OtherSetting->Scrpting Define Symbols中找到

除了模块解耦以外,我们也可以使用宏做一些其他事情。
例如我们在开发我们的库时或许想要关闭某些功能,但是却又有一些代码存在依赖,那么我们就可以使用宏来进行操作。

例如:我的开发者模式打开的时候,我的操作窗口就会变成这样:

但是千万不要滥用宏,宏的好处在于能够将不需要但是依旧有着依赖的代码剔除,但是有着调试麻烦的缺点。
我们没有办法通过一般的方法像搜索变量一样地搜索宏,所以能用变量判断的地方还是用变量判断,除非编译实在无法进行下去了。
我在编写模块的时候,一定要注意模块之间的依赖,一旦出现了跨模块的依赖就使用宏进行分离。
当然,如果想使用消息分发系统的话也可以,但是局限性要大于宏。

发表评论

电子邮件地址不会被公开。 必填项已用*标注