マクロ定義により、さまざまな状況で使用されるコードを簡単に区別できます。
より古典的なものは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 プラットフォームを例として取り上げます。必要に応じて書き換えたり、マクロ コマンドを使用してマルチプラットフォーム スタイルを構成することもできます。次の図を参照してください。
最後に、マクロコマンドを変更するたびに、システムの再コンパイルを待つ必要があるため、コンパイルの完了を待たずに他の操作を実行すると、マクロコマンドが追加されずにバグが発生する可能性があることに注意してください。または削除されました。