Unity 动态修改宏定义

宏定义可以方便的区分出不同情况下使用的代码。
比较经典的就是 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。

猜你喜欢

转载自blog.csdn.net/EverNess010/article/details/130638860
今日推荐