【Unity】一键切换是否允许#if UNITY_EDITOR条件编译生效

2023-10-30

在项目中经常会条件编译的方式来让编译器环境和非编译器环境跑不同的代码,但这种方式会让非编译器环境的代码测试变得十分不方便。UNITY_EDITOR也是Unity预定义的宏,不能直接在PlayerSettings里面增加或删除。

#if UNITY_EDITOR
    //编译器环境下的代码逻辑
#else
    //非编译器环境下的代码逻辑
#endif

实现思路:

用#undef UNITY_EDITOR可以取消unity预定义的UNITY_EDITOR宏,这样就可以让代码在编译器环境下直接进入非编译器环境的代码块。

#undef UNITY_EDITOR

#undef可以用来取消宏的定义,但#undef的作用范围只有当前文件,当多个文件都有用到#if UNITY_EDITOR的时候,当想调试非编译器环境的代码时,这些文件都需要加上#undef,调试编译器环境的代码时,又要一个个都删掉#undef...

这种情况下可以用一个自定义宏去控制#undef UNITY_EDITOR是否执行,我们只需要在每个脚本里面加上以下代码,然后在PlayerSettings里面控制是否定义ENABLE_EDITOR_MODE就可以控制多个脚本(注意以下语句必须放在using上面)。

#if ENABLE_EDITOR_MODE
#undef UNITY_EDITOR
#endif

具体做法:

Step1:在所有用到#if UNITY_EDITOR的脚本最上面加上代码块:

#if ENABLE_EDITOR_MODE
#undef UNITY_EDITOR
#endif

//using UnityEngine;之类
//...

#if UNITY_EDITOR
    //编译器环境下的代码逻辑
#else
    //非编译器环境下的代码逻辑
#endif

//...

Step2:用一个脚本来增加/移除自定义宏,并放到菜单栏

using System.Collections.Generic;
using UnityEditor;

public class EditorTools
{
    /// <summary>
    /// 当设置这个之后,#if UNITY_EDITOR不生效,移除后,#if UNITY_EDITOR生效
    /// </summary>
    private static string ENABLE_EDITOR_MODE
    {
        get
        {
            return "ENABLE_EDITOR_MODE";
        }
    }


    [MenuItem("MyTools/Symbols Setting/Enable Editor Mode")]
    static void EnableEditorMode()
    {
        RemoveDefineSymbols(ENABLE_EDITOR_MODE);
    }

    [MenuItem("MyTools/Symbols Setting/Disable Editor Mode")]
    static void DisableEditorMode()
    {
        AddDefineSymbols(ENABLE_EDITOR_MODE);
    }

    /// <summary>
    /// 添加宏
    /// </summary>
    /// <param name="symbol"></param>
    private static void AddDefineSymbols(string symbol)
    {
        string currentDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
        HashSet<string> defines = new HashSet<string>(currentDefines.Split(';')) {
            symbol
        };

        string newDefines = string.Join(";", defines);
        if (newDefines != currentDefines)
        {
            PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newDefines);
        }
    }


    /// <summary>
    /// 删除宏
    /// </summary>
    /// <param name="symbol"></param>
    private static void RemoveDefineSymbols(string symbol)
    {
        string currentDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
        HashSet<string> defines = new HashSet<string>(currentDefines.Split(';'));
        defines.Remove(symbol);

        string newDefines = string.Join(";", defines);
        if (newDefines != currentDefines)
        {
            PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newDefines);
        }
    }
}

Step3:在菜单栏控制是否允许#if UNITY_EDITOR条件编译生效

 当按了Disable Editor Mode后,在编译器下,会跳过#if UNITY_EDITOR语句进入#else的逻辑

我不是很确定实际项目里面是怎么做的,如果还有其他更好的办法欢迎告诉我~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity】一键切换是否允许#if UNITY_EDITOR条件编译生效 的相关文章

  • UE4 解决景深效果闪烁问题

    原因 1 模型的垂直竖线 造成抗锯齿算法对竖线的渲染计算 处于一种不稳定的状态 因此闪烁 解决办法 使用LOD 用贴图去替代线条模型 2 材质的法线贴图 当法线贴图含有垂直竖线的纹理效果 也会造成闪烁 比如这种幕墙材质 解决办法 关闭或动态
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin

随机推荐

  • [管理与领导-85]:IT基层管理者 - 核心技能 - 高效执行力 - 10 - 高效执行力的9个段位

    目录 前言 一段 准确执行 快速反应 坚决执行 态度很重要 二段 结果导向 苦劳过后 有功劳 有结果很重要 三段 有始有终 主动反馈 有始有终 即时汇报 不断改进 持续很重要 四段 结果到位 做事提前量 超越期望 提前和可预期很重要 五段
  • sun m4000 服务器文档,文档2、安装配置sun enterprise m4000主机.doc(13页)-原创力文档...

    青州码头小型机项目实施方案 Solaris 10 U7 Oracle 10g ZFS Sun Cluster 3 2 U2 文档二 安装配置SUN Enterprise M4000 主机 一 配置M4000 主机控制卡 管理控制台 1 使用
  • 芯片设计中的时钟与约束

    1 同步电路与异步电路 首先来谈谈同步电路与异步电路 那么首先就要知道什么是同步电路 什么是异步电路 对于同步时序电路 不同的文章有不同的说法 大致有下面的定义方法 对于比较严格的定义 一个电路是同步电路 需要满足一下条件 每一个电路元件是
  • phpMyAdmin配置与安装 (适用于CentOS7)

    一 LNMP或LAMP的配置 phpMyAdmin运行在该架构中 注 php fpm出厂默认使用者和拥有者为apache 所以相比较来说LAMP更适合 本例以LNMP为架构 1 nginx安装 并设置开机自启动 root cy ed03 l
  • 【React】React路由概念

    文章目录 1 路由概述 1 1 后端路由 1 2 前端路由 2 SPA 3 前端路由两种模式 3 1 hash模式 3 2 history模式 1 路由概述 路由 简单来说 路由是根据不同的url地址展示不同的内容或页面 一个路由就是一个映
  • echarts x坐标文字换行显示

    xAxis type category data axisLabel 坐标轴刻度标签的相关设置 interval 0 显示一竖条 formatter function value return value split join n 一行显示
  • 给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。

    给定一个数组nums 编写一个函数将所有0移动到数组的末尾 同时保持非零元素的相对顺序 要求 1 必须在原数组上操作 不能拷贝额外的数组 2 尽量减少操作次数 3 注意时间空间复杂度 输入 0 1 0 3 12 输出 1 3 12 0 0
  • Linux文件权限分段说明

    Linux文件权限分段说明 Linux中的文件属性权限描述一共10位长度 并分为四段 如 rwxrwx 一共十位 第一段占一位 代表文件类型 其中例子中的 代表普通文件 其余的表示还有 文件类型部分 文件 d 文件夹 l 链接文件 可以理解
  • nginx解析PHP特卡,nginx解析PHP程序报错的解决方案

    root server 2 log tail f nginx error log 2019 07 31 01 51 02 error 26151 0 52 FastCGI sent in stderr Primary script unkn
  • Springboot 文件处理导入导出

    简单记录下使用Springboot进行文件与后端交互 excel前台导出等内容 这里用到了 elelemt ui HTML vue Springboot框架 一 后台导入 HTML
  • VBS加载微软网页控件webview2(Edge-Chromium谷歌内核)

    VBS加载微软网页控件webview2 Edge Chromium谷歌内核 VBA加载Webview2浏览器内核 代替了ie的webbrowser控件 效果类似 资源 VBS加载webview2控件代替ie的webbrowser Edge
  • Oracle UTL_HTTP(收集汇总有用资料)

    From Oracle The UTL HTTP package makes Hypertext Transfer Protocol HTTP callouts from SQL and PL SQL You can use it to a
  • shell脚本中任意输入三个数,输出最大值

    Linux下用shell脚本任意输入三个数 输出最大值 bin bash read p 请输入第一个数 n1 read p 请输入第二个数 n2 read p 请输入第三个数 n3 max n1 if n2 gt max then max
  • 同态加密简介

    同态加密概述 基本概念 同态加密 Homomorphic Encryption HE 指将原始数据经过同态加密后 对密文进行特定的运算 得到的密文计算结果在进行同态解密后的得到的明文等价于原始明文数据直接进行相同计算所得到的数据结果 历史与
  • 快速加入Health Kit,一文了解审核流程

    HUAWEI Health Kit是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台 在获取用户授权后 开发者可以使用Health Kit提供的开放能力获取运动健康数据 基于多种类型数据构建运动健康领域应用与服务 为用户打造
  • axios实现本地缓存

    import axios from axios 线上数据库 axios defaults baseURL XXXXXXXXXXXXX 测试数据库 axios defaults baseURL http 192 168 1 25 8080 a
  • QMap和std::map的遍历

    两种遍历方式都使用迭代器 1QMap使用Iterator key 和Iterator value 方法获取第一个或第二个元素的值 而std map使用Iterator gt first Iterator gt second 来获取第一个或第
  • 为什么把系统带宽定义为-3dB?

    原文来自公众号 工程师看海 为什么把系统带宽定义为 3dB 对于我们常说的电路带宽或系统带宽 指的是增益为 3dB时的频率点 为什么选 3dB呢 对于带宽我们可以粗暴的理解为 系统的有效频率范围小于 3dB时的频点 简单来说 比如一个系统
  • 微信小程序练手实战:前端+后端(Java)

    1 前言 现在微信小程序越来越火了 相信不少人都通过各种途径学习过微信小程序或者尝试开发 作者就是曾经由于兴趣了解开发过微信小程序 最终自己的毕业设计也是开发一个微信小程序 所以现在用这篇博客记录我之前开发的一些经验和一些心得吧 2 主要内
  • 【Unity】一键切换是否允许#if UNITY_EDITOR条件编译生效

    在项目中经常会条件编译的方式来让编译器环境和非编译器环境跑不同的代码 但这种方式会让非编译器环境的代码测试变得十分不方便 UNITY EDITOR也是Unity预定义的宏 不能直接在PlayerSettings里面增加或删除 if UNIT