Unity 动态修改宏定义

这篇具有很好参考价值的文章主要介绍了Unity 动态修改宏定义。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

核心接口为:
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
}

unity 动态修改宏定义,Unity学习,unity
unity 动态修改宏定义,Unity学习,unity
以上为两种表现方式,及其对应的代码,此处以 Android 平台为例,也可以根据自身需求改写或用宏命令配置出多平台的样式,可参考下图:

unity 动态修改宏定义,Unity学习,unity


最后,需要注意的是,每次更改完宏命令,需要等待系统重新编译,如果不等编译完成就进行其他操作可能会导致由于宏命令没有添加或删除而出现的 bug。文章来源地址https://www.toymoban.com/news/detail-775532.html

到了这里,关于Unity 动态修改宏定义的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Unity 学习笔记】规则瓦片和动态瓦片的应用

            上一篇笔记记录了瓦片调色板的应用,瓦片调色板常用于游戏场景的绘制,可以完全按照作者的想法绘制地图,自由度大。但是瓦片调色板也有其缺点,就是需要人一点一点地绘制。在这片笔记中,我将介绍两种新添加的瓦片,即规则瓦片和动态瓦片,有了这两类

    2024年02月10日
    浏览(26)
  • 【unity学习笔记-如何给动态的人物添加碰撞体】

    前景提要 如题,项目中想实现和人物进行简单的互动,比如点击他的手臂的时候他会播放手臂的动作,点击脚的时候播放预设的和脚有关的动画 之前我的实现方式是十分暴力的在人物模型中对应的部位添加一个子物体,给子物体添加正方体/圆体这种规则的碰撞体,然后因为他是在

    2023年04月08日
    浏览(69)
  • unity的C#学习——命名空间的定义与访问、using语句的常见用法

    在C#中,命名空间(Namespace)是一种 将类和其他相关类型组织在一起的方式 。可以将命名空间看作是一个容器,用于管理和组织类和其他类型。通过将相关的类型组织在一起,可以使代码更加清晰和易于维护。 命名空间的主要目的是为了避免名称冲突,使得开发人员可以 使

    2024年02月11日
    浏览(43)
  • Unity Timeline学习笔记(3) - SignalTrack信号轨道和自定义带参数的Marker信号和轨道

    信号轨道,顾名思义就是运行到某处发送一个信号。 普通用法就是没有任何封装的,个人感觉特别难用,但是有必要理解一下工作原理。 添加信号 我们添加一个信号资源 生成后可以看到资源文件,这个是可以拖到SignalTrack上的。 我们在Timeline上添加两个信号轨道,并拖动信

    2024年04月13日
    浏览(27)
  • Unity Shader 学习笔记(4)URP渲染管线带阴影PBR-Shader模板 -- 新增可自定义阴影颜色

    材质面板截图 功能实现(URP渲染管线下): 1、进一步优化Shader结构和算法; 2、包含PBR材质; 3、投射和接收阴影,并升级 支持自定义阴影颜色 ; 4、支持点光源照射(但不支持点光源阴影)。 通用渲染截图 自定义阴影颜色截图 完整代码: 写在最后: 1、在我的上一篇文

    2024年02月12日
    浏览(29)
  • uniapp 自定义发行 动态修改 manifest.json

    这边需求是 : 根据不同的打包环境 设置不同的标题以及路径。方便各种调试。防止 每次 手动 每次修改 manifest.json 出错  uniapp 自定义发行: 添加自定义发行之后 Hbuilder 编辑器会自动多 出来 按钮 : 官方文档:概述 | uni-app官网 我这里的配置是这样: package.json 这里主要用于

    2024年02月11日
    浏览(80)
  • 如何修改unity项目名称

    在Unity中,修改项目名称需要对一些文件和设置进行修改。以下是修改Unity项目名称的步骤: 在Unity编辑器中,选择项目文件夹(Project)面板中的“Assets”,然后点击右键,在弹出菜单中选择“Show in Explorer”(在Windows系统上)或“Reveal in Finder”(在Mac系统上)。这将打开项

    2024年02月11日
    浏览(31)
  • Unity 修改脚本的模板

    在哪里可以修改脚本的模板?怎么修改脚本的模板? 修改模板 Unity 新建脚本的时候,会自动生成一些代码,默认模板创建后是这样的 大部分时候这个模板是不满足要求的,要的信息没有生成,不要的信息还要删除掉。听说 Update 这样的函数是一直在执行的,没用的话不删除

    2024年03月26日
    浏览(42)
  • unity 修改默认脚本

       

    2024年02月13日
    浏览(33)
  • 如何修改unity的背景颜色

    要在Unity中将背景颜色设为黑色,可以按照以下步骤进行: 1、在Unity编辑器中,选择你想要修改背景颜色的摄像机对象(一般是Main Camera)。 2、在Inspector面板中,找到\\\"Clear Flags\\\"(清除标志)属性。 3、将\\\"Clear Flags\\\"属性的值设置为\\\"Solid Color\\\"(纯色)。 4、在\\\"Background\\\"(背景)

    2024年04月13日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包