Unity 动态修改宏定义

2023-11-01

宏定义可以方便的区分出不同情况下使用的代码。
比较经典的就是 UNITY_EDITOR 这类

#if UNITY_EDITOR
	Debug.Log("当前是编辑器环境");
#else
	Debug.Log("当前不是编辑器环境");
#endif

开发者同样可以自己定义宏来进行一些控制,位置如下图:

在这里插入图片描述
但是每次都要自己去手动添加和修改未免有些麻烦,所以就有了通过代码动态设置宏定义的方式。方便开发者随时开启和关闭某种功能。

核心接口为:
PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup targetGroup);

PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup targetGroup, string defines);

public class TestEditor : MonoBehaviour
{
#if !TEST_DEFINE_SYMBOLS
    [MenuItem("TestTools/[OFF] TestDefineSymbols", false, 1000)]    
    public static void MenuTestDefineSymbols()
    {
        // 动态获取 Android 平台的宏定义
        string tmpSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
        if (string.IsNullOrEmpty(tmpSymbols))
        {
            tmpSymbols += "TEST_DEFINE_SYMBOLS";
        }
        else
        {
            tmpSymbols += ";TEST_DEFINE_SYMBOLS";
        }

        // 动态修改宏定义
        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, tmpSymbols);
    }
#else
    [MenuItem("TestTools/[ON] TestDefineSymbols", false, 1000)]
    public static void MenuTestDefineSymbols()
    {
        // 动态获取 Android 平台的宏定义
        string tmpSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);

        string[] symbolArray = tmpSymbols.Split(';');

        for (int i = 0; i < symbolArray.Length; i++)
        {
            if(symbolArray[i] == "TEST_DEFINE_SYMBOLS")
            {
                symbolArray[i] = "";
            }
        }

        tmpSymbols = "";
        for (int i = 0; i < symbolArray.Length; i++)
        {
            if (string.IsNullOrEmpty(symbolArray[i])) continue;

            if(tmpSymbols == "")
            {
                tmpSymbols += symbolArray[i];
            }
            else
            {
                tmpSymbols += ";";
                tmpSymbols += symbolArray[i];
            }
        }
        
        // 动态修改宏定义
        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, tmpSymbols);
    }
#endif

#if !TEST_DEFINE_SYMBOLS_CHECK

    [MenuItem("TestTools/CheckDefineSymbols", false, 1000)]
    public static void MenuTestDefineSymbols_Check()
    {
        // 动态获取 Android 平台的宏定义
        string tmpSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
        if (string.IsNullOrEmpty(tmpSymbols))
        {
            tmpSymbols += "TEST_DEFINE_SYMBOLS_CHECK";
        }
        else
        {
            tmpSymbols += ";TEST_DEFINE_SYMBOLS_CHECK";
        }

        // 动态修改宏定义
        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, tmpSymbols);

        // 设置勾选状态
        Menu.SetChecked("TestTools/CheckDefineSymbols", true);
    }
#else
    [MenuItem("TestTools/CheckDefineSymbols", false, 1000)]
    public static void MenuTestDefineSymbols_Check()
    {
        // 动态获取 Android 平台的宏定义
        string tmpSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);

        string[] symbolArray = tmpSymbols.Split(';');

        for (int i = 0; i < symbolArray.Length; i++)
        {
            if(symbolArray[i] == "TEST_DEFINE_SYMBOLS_CHECK")
            {
                symbolArray[i] = "";
            }
        }

        tmpSymbols = "";
        for (int i = 0; i < symbolArray.Length; i++)
        {
            if (string.IsNullOrEmpty(symbolArray[i])) continue;

            if(tmpSymbols == "")
            {
                tmpSymbols += symbolArray[i];
            }
            else
            {
                tmpSymbols += ";";
                tmpSymbols += symbolArray[i];
            }
        }
        
        // 动态修改宏定义
        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, tmpSymbols);
                
        // 取消勾选状态
        Menu.SetChecked("TestTools/CheckDefineSymbols", false);
    }
#endif
}

在这里插入图片描述
在这里插入图片描述
以上为两种表现方式,及其对应的代码,此处以 Android 平台为例,也可以根据自身需求改写或用宏命令配置出多平台的样式,可参考下图:

在这里插入图片描述


最后,需要注意的是,每次更改完宏命令,需要等待系统重新编译,如果不等编译完成就进行其他操作可能会导致由于宏命令没有添加或删除而出现的 bug。

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

Unity 动态修改宏定义 的相关文章

  • Unity—UGUI

    每日一句 读数 学习 去更远的地方 才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例 用户名和密码 Toggle组件 案例 冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • using UnityEditor引用注意事项

    本文转载自http blog csdn net czlilove article details 19979725 在运行时脚本中使用UnityEditor命名空间 假如该脚本被挂在场景中的物体上 那么 可以这样做 在Unity编辑器中运行
  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

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

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d 自定义的图片无法放入source image中

    须将图片的texture type改为 sprite
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • Python3中.pyi文件介绍

    在看PyTorch代码时 在一些模块中经常会发现 pyi文件 如下图所示 是PyTorch中torch optim模块中的 pyi文件 每种实现优化算法的 py文件 都有一个对应的 pyi文件 每个 pyi文件中的内容都相似 仅有类的 in
  • 词法分析之Bi-LSTM-CRF框架

    词法分析是NLP的一项重要的基础技术 包括分词 词性标注 实体识别等 其主要算法结构为基于Bi LSTM CRF算法体系 下面对Bi LSTM CRF算法体系进行介绍 引言 首先抛开深层的技术原因 来从宏观上看一下为什么LSTM Bi LS
  • python的scrapy框架----->可以使我们更加强大,为打破写许多代码而生

    目录 scrapy框架 pipeline itrm shell scrapy模拟登录 scrapy下载图片 下载中间件 scrapy框架 含义 构图 运行流程 1 scrapy框架拿到start urls构造了一个request请求 2 r
  • linux下 tomcat 日志文件过大_Linux个性化日志文件上色 tail 颜色

    Linux个性化日志文件上色 tail 颜色 ccze是一个很好的工具 它为阅读或搜索日志文件的艰巨任务带来了真正的乐趣 它使用模块化的方法来支持流行的应用程序 如Apache Postfix Exim等的自定义颜色格式 在CentOS和F
  • 软件工程期末考试题库(超全)

    文章目录 软件工程期末考试题库 选择题 填空题 判断题 简答题 画图题 软件工程期末考试题库 选择题 具有风险分析的软件生命周期模型是 C A 瀑布模型 B 喷泉模型 C 螺旋模型 D 增量模型 软件工程的基本要素包括方法 工具和 A A
  • 解决手动跳转页面,element菜单未高亮

    主要是通过修改activeIndex来进行高亮选中
  • QML树控件TreeView的使用(上)

    在Qt5 5之前是没有树控件的 我们在使用时用的是ListView来构造出一个树 Qt5 5之后的QML开发阶段 有了树控件TreeView 本篇着重记录QML的TreeView的使用 根据MVC分解文件 类 如下 TreeControll
  • Q数的定义

    1 Q数的定义 对于16位的DSP而言 Q数定义共有16种 其简化写法分别是Q15 Q14 Q13到Q0 其数学含义可以 在其标准定义中确定 分别是Q1 15 Q2 14 Q3 13到Q16 0即标准形式为 Qn m 其数学意义是Q数的最大
  • 【抓包分析tcp协议】

    一 七层网络模型与常见协议 二 协议分析工具 1 网络监听 TcpDump WireShark 适用偏底层的协议分析 2 代理Proxy 适用偏高层的协议分析 如http 推荐工具 手工测试charles 全平台 安全测试burpsuite
  • Proxy error: Could not proxy request 解决方法

    问题本质是代理失败 常见原因 1 后端相应的被代理服务器没有开启 2 代理规则写错 前后端部署的域名应一致 3 没有把vue config js中的 before require mock mock server js 注释掉 导致走代理前
  • linux-select函数详解

    写在前面 主要是参考下边的两篇文章 对文章的内容做了一些记录 使用背景 select是实现IO多路复用的一种方式 典型场景是网络多并发服务器 服务器需要和多个客户端保持连接 相关源码可参考参考中的第二篇文章 IO多路复用概念参考第三篇文章
  • ISOWEEK的算法

    算ISOWEEK的时候 通常是以 该日的所属周数 1 该年的1 4所属周数 但也有特殊的情况 case1 可能当年的一月1号到3号是属于前年的 case2 可能前年12月29到31号是属于下一年的 SQL的算法 CREATE FUNCTIO
  • 开源自动扫描工具OpenSCAP介绍

    OpenSCAP 是一个获得 SCAP 认证的免费开源的自动化扫描 基线核查 报告和自动修复工具 目前主要由 Redhat 进行维护 OpenSCAP 由工具和基线库两个部分组成 两者没有紧密的耦合关系 比如使用 http vuls io
  • 服务器ie安全增强关闭还是显示,如何关掉ie浏览器的增强安全配置

    在 Windows Sever 2012 中打开 IE 浏览器时 IE10 会出现 已启用 Internet Explorer 增强的安全配置 的提示信息 在安全性等级中会设置以 高安全性 如果我想要关闭 Internet Explorer
  • Anaconda系统配置、换源、环境隔离、pycharm环境配置一站式教程

    Anaconda配置一站式教程 欢迎访问我的博客sakura 绘梨衣 1 安装conda 这个下载 除了安装路径 无脑确定就行了 下载网址 Free Download Anaconda 选择安装系统直接下载 最好是不要安装在C盘 反对C盘战
  • Python对excel写入数据操作实例代码(只供参考)

    coding utf8 把buffer中的信息 写入到excel中 并按照要求 构造表格样式 导入readCSV模块 用来获取buffer数据 from readCSV import readCSV from readConfig impo
  • httpclient 工具类

    1 类 package com cainiao manage utils import org apache http HttpEntity import org apache http NameValuePair import org a
  • 类加载 器&反射

    一 类加载器 1 1类加载 1 2类加载器 理解 1 2 1类加载器的作用 1 2 2JVM的类加载机制 1 2 3Java中的内置类加载器 1 2 4ClassLoader 中的两个方法 二 反射 2 1反射的概述 理解 2 2获取Cla
  • 初学maven详细总结

    文章转载自 https www cnblogs com tzyy p 4768859 html 初学maven 简单总结一下学习心得 若有不对的地方 欢迎各位大神给我指正 总结分为6个部分 maven概述 maven安装 maven项目结构
  • Unity 动态修改宏定义

    宏定义可以方便的区分出不同情况下使用的代码 比较经典的就是 UNITY EDITOR 这类 if UNITY EDITOR Debug Log 当前是编辑器环境 else Debug Log 当前不是编辑器环境 endif 开发者同样可以自