使用C#的Conditional特性与Unity编辑器宏命令做条件编译

概要

在传统的C#项目中,用Conditional特性做条件编译时,需要在Visual Studio中项目的属性里添加上条件编译符号,用法参考这篇文章

而在Unity项目中,条件编译符号需要在Unity Editor编辑器中添加。

为什么要用条件编译

Unity中最常见的使用条件编译的情况就是分平台编译不同的代码片段。由于Unity是跨平台的,不同平台有不同的特性,我们经常能见到 #if...#endif 来做条件编译的代码块。

另一种常见用法是,例如在编辑器下运行时输出日志,而在打包真机调试时为了节省性能需要关闭日志(在Update()函数中每帧输出日志很耗性能)。此时可以把输出日志的函数使用Conditional特性来标记上,只有在Unity编辑器中开启了指定的宏命令,这个输出日志的函数才能被编译,即可很方便地开关日志。

例子

复制代码
namespace UnityEngine
{
    public static class DebugExtension
    {
        [Conditional("EnableLog")]
        public static void Logger(this object obj, string message)
        {
            Debug.Log(message);
        }
   }
}
复制代码

上面的代码中,通过C#的扩展方法,给所有的System.Object类添加了一个Logger()方法,该方法被标记为[Conditional("EnableLog")]。需要在Unity编辑器中添加上EnableLog宏命令,该方法才能被编译。

Unity编辑器添加宏命令在File - Build Settings - Player Settings - Other Settings中,如下图。

输入了EnableLog后,上面的Logger()方法才能被编译。如果去掉EnableLog,所有调用了Logger()函数的代码也不会被编译!

 this.Logger("日志扩展类中的方法。该方法需要在Unity编辑器中添加宏命令EnableLog才能被编译!");

 

posted @   霍莉雪特  阅读(6448)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示