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

这篇具有很好参考价值的文章主要介绍了【Unity】一键切换是否允许#if UNITY_EDITOR条件编译生效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在项目中经常会条件编译的方式来让编译器环境和非编译器环境跑不同的代码,但这种方式会让非编译器环境的代码测试变得十分不方便。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条件编译生效

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

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

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

我不是很确定实际项目里面是怎么做的,如果还有其他更好的办法欢迎告诉我~~文章来源地址https://www.toymoban.com/news/detail-513022.html

到了这里,关于【Unity】一键切换是否允许#if UNITY_EDITOR条件编译生效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Editor 编辑器介绍

    Project 窗口 :列出所有的资源 Console 窗口 :日志输出 Hierarchy 窗口 :在Project 窗口选择一个 Scene 场景后,会在这个窗口显示这个构成这个场景的所有游戏对象 Inspector 窗口: 在 Hierarchy窗口 或 Project 窗口中选择任何一个资源,Inspector窗口 显示与这个资源相关的所有属性。 S

    2024年02月16日
    浏览(31)
  • Unity Editor Inspector界面编辑

    一、继承MonoBehaviour 1、[Header(\\\" \\\")] 标题 2、[Tooltip(\\\" \\\")] 如果鼠标光标是在字段上,显示的说明文本 3、[Range(0, 5)] 将int、float变量限制在特定范围内,滑动条 4、[Multiline] 字符串多行文本显示 5、[TextArea(2, 5)] 字符串多行文本显示,可以设置可现实的最大值和最小值的行数

    2024年02月08日
    浏览(31)
  • 【unity】Runtime Editor的简单使用

    版本v2.26 定位、旋转、伸缩变形句柄 添加句柄预制体 位置:Battlehub→RTEditor→Content→Runtime→RTHandles→Prefabs PositionHandle(移动句柄) RotationHandle(旋转句柄) ScaleHandle(缩放句柄) 将预制体拖入场景中 下面以PositionHandle(移动句柄)为例,其余句柄使用方法都一样 选中编辑

    2024年02月09日
    浏览(28)
  • Unity安装后无法打开(No valid Unity Editor license found)

    Unity 下载点击后出现如下界面:  (图片自己运行时没有截屏,找的知乎作者PISCOnoob NOOB wanna be PRO的图) 解决办法1:下载unity hub 登陆后可打开  其他解决办法……(因为这样就好了,还没遇见其他类似问题,以后遇见了再增添)  

    2024年02月06日
    浏览(28)
  • 【Unity小知识】Editor编写常用方法汇总

            汇总一些Unity Editor开发的常用方法和实现方式,会持续更新。 添加自定义菜单栏方法 如图一,添加自定义的菜单栏需要使用UnityEditor的命名空间,我们自定义的EditorTools类需要继承EditorWindow类。然后就是定义菜单栏点击后所执行的具体函数CustomEditroFunction, 这里需要

    2024年02月05日
    浏览(29)
  • Unity Editor扩展 实现一个Excel读表窗口

    第一个参数是路径 第二个参数默认false 第三个参数是优先级 越低越靠上 excelScrollerPos = EditorGUILayout.BeginScrollView( excelScrollerPos ); //其它需要渲染的目标内容写着中间 EditorGUILayout.EndScrollView();

    2024年02月16日
    浏览(29)
  • Unity Hub报错:No valid Unity Editor license found. Please activate your license.

    最近 遇到一个问题,打开高版本时Hub抛出异常:No valid Unity Editor license found. Please activate your license. 首先你必须排除是否登录Unity Hub,并且激活许可证。 目录 方法一:禁用网络(这个可能无效) ​编辑方法二:(亲测有效) 删除此路径下的文件 -Windows系统: C:ProgramDataUnit

    2024年02月04日
    浏览(27)
  • Unity Editor 遍历指定文件夹下的所有prefab

    适用场景:                  查找指定文件夹下所有的prefab并找到所有引用的图片及路径。 步骤分析:                 1、通过guid获取资源路径                 2、获取文件夹中包含后缀为.prefab的路径                 3、编辑器下加载该资源(如果对资源有编辑的话

    2024年02月04日
    浏览(50)
  • Unity 3D提示“No valid unity editor license found, please active your license”如何解决?

            初次安装Unity 3D,打开提示“No valid unity editor license found, please active your license”,不妨尝试一下本文的方法。 进入Unity3D中文下载官网, https://unity.cn/releases(Unity 3D安装包也可以通过此渠道下载); 需要登录(如没有账号先注册,很简单); 下载Unity Hub;  打开

    2024年02月11日
    浏览(44)
  • Sprite Editor图片编辑器的使用_unity基础开发教程

    SpriteEditor是Unity引擎中的一个工具,用于创建和编辑2D图片。它提供了一系列功能,可以对图片进行剪裁、切割、翻转、旋转、调整大小等操作,以及设置图片的碰撞检测形状和渲染模式。 SpriteEditor可以帮助开发者将多张图片合并成动画精灵,并为每一帧设置播放时间和循环

    2024年02月01日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包