En los proyectos, la compilación condicional se usa a menudo para permitir que el entorno del compilador y el entorno del no compilador ejecuten códigos diferentes, pero este método hará que la prueba del código del entorno del no compilador sea muy inconveniente. UNITY_EDITOR también es una macro predefinida por Unity, que no se puede agregar ni eliminar directamente en PlayerSettings.
#if UNITY_EDITOR
//编译器环境下的代码逻辑
#else
//非编译器环境下的代码逻辑
#endif
Ideas de implementación:
Use #undef UNITY_EDITOR para cancelar la macro UNITY_EDITOR predefinida de Unity, de modo que el código pueda ingresar directamente al bloque de código del entorno que no es del compilador en el entorno del compilador.
#undef UNITY_EDITOR
#undef se puede usar para cancelar la definición de macros, pero el alcance de #undef es solo el archivo actual. Cuando se usan varios archivos #if UNITY_EDITOR, cuando desea depurar código en un entorno sin compilador, estos archivos deben ser agregado #undef, al depurar el código del entorno del compilador, hay que borrar #undef uno por uno...
En este caso, puede usar una macro personalizada para controlar si #undef UNITY_EDITOR se ejecuta Solo necesitamos agregar el siguiente código en cada secuencia de comandos y luego controlar si definir ENABLE_EDITOR_MODE en PlayerSettings para controlar varias secuencias de comandos (tenga en cuenta que la siguiente declaración debe colocarse encima de usar).
#if ENABLE_EDITOR_MODE
#undef UNITY_EDITOR
#endif
métodos específicos:
Paso 1: agregue un bloque de código en la parte superior de todos los scripts que usan #if UNITY_EDITOR:
#if ENABLE_EDITOR_MODE
#undef UNITY_EDITOR
#endif
//using UnityEngine;之类
//...
#if UNITY_EDITOR
//编译器环境下的代码逻辑
#else
//非编译器环境下的代码逻辑
#endif
//...
Paso 2: use un script para agregar/eliminar macros personalizadas y colóquelas en la barra de menú
using System.Collections.Generic;
using UnityEditor;
public class EditorTools
{
/// <summary>
/// 当设置这个之后,#if UNITY_EDITOR不生效,移除后,#if UNITY_EDITOR生效
/// </summary>
private static string ENABLE_EDITOR_MODE
{
get
{
return "ENABLE_EDITOR_MODE";
}
}
[MenuItem("MyTools/Symbols Setting/Enable Editor Mode")]
static void EnableEditorMode()
{
RemoveDefineSymbols(ENABLE_EDITOR_MODE);
}
[MenuItem("MyTools/Symbols Setting/Disable Editor Mode")]
static void DisableEditorMode()
{
AddDefineSymbols(ENABLE_EDITOR_MODE);
}
/// <summary>
/// 添加宏
/// </summary>
/// <param name="symbol"></param>
private static void AddDefineSymbols(string symbol)
{
string currentDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
HashSet<string> defines = new HashSet<string>(currentDefines.Split(';')) {
symbol
};
string newDefines = string.Join(";", defines);
if (newDefines != currentDefines)
{
PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newDefines);
}
}
/// <summary>
/// 删除宏
/// </summary>
/// <param name="symbol"></param>
private static void RemoveDefineSymbols(string symbol)
{
string currentDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
HashSet<string> defines = new HashSet<string>(currentDefines.Split(';'));
defines.Remove(symbol);
string newDefines = string.Join(";", defines);
if (newDefines != currentDefines)
{
PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, newDefines);
}
}
}
Paso 3: controle si la compilación condicional #if UNITY_EDITOR puede tener efecto en la barra de menú
Cuando se presiona Deshabilitar modo de editor, en el compilador, se omitirá la instrucción #if UNITY_EDITOR y se ingresará la lógica #else
No estoy seguro de cómo hacerlo en el proyecto real, si hay otras formas mejores, házmelo saber ~~