[Unity] Cambia con un clic si se permite que la compilación condicional #if UNITY_EDITOR surta efecto

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 ~~

Supongo que te gusta

Origin blog.csdn.net/weixin_61427881/article/details/129846597
Recomendado
Clasificación