宏定义可以方便的区分出不同情况下使用的代码。
比较经典的就是 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 平台为例,也可以根据自身需求改写或用宏命令配置出多平台的样式,可参考下图:
文章来源:https://www.toymoban.com/news/detail-775532.html
最后,需要注意的是,每次更改完宏命令,需要等待系统重新编译,如果不等编译完成就进行其他操作可能会导致由于宏命令没有添加或删除而出现的 bug。文章来源地址https://www.toymoban.com/news/detail-775532.html
到了这里,关于Unity 动态修改宏定义的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!