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
}

ここに画像の説明を挿入
ここに画像の説明を挿入
上記は 2 つの表現方法とそれに対応するコードです。ここでは Android プラットフォームを例として取り上げます。必要に応じて書き換えたり、マクロ コマンドを使用してマルチプラットフォーム スタイルを構成することもできます。次の図を参照してください。

ここに画像の説明を挿入


最後に、マクロコマンドを変更するたびに、システムの再コンパイルを待つ必要があるため、コンパイルの完了を待たずに他の操作を実行すると、マクロコマンドが追加されずにバグが発生する可能性があることに注意してください。または削除されました。

おすすめ

転載: blog.csdn.net/EverNess010/article/details/130638860
おすすめ