¿Qué estás buscando?
Engine & platform

Acelere los flujos de trabajo de su programador

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESProduct Marketing Core Tech
Sep 27, 2021|10 minutos
Acelere los flujos de trabajo de su programador
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.

Recientemente publicamos dos publicaciones de blog,Cinco formas de acelerar sus flujos de trabajo en el Editor y Acelere los flujos de trabajo de sus artistas, ambas basadas en nuestro libro electrónico para desarrolladores profesionales, Más de 70 consejos para aumentar la productividad con Unity 2020 LTS. En esta tercera y última publicación de blog de la serie, nos centramos en los flujos de trabajo y las funciones que ayudan a los programadores a hacer más en menos tiempo. Comencemos con cómo puedes ahorrar tiempo de compilación al realizar pruebas de juego.

Ahorre tiempo de compilación con la configuración de Entrar al modo de reproducción

Cuando ingresa al modo de reproducción, su proyecto comienza a ejecutarse como lo haría en una compilación. Cualquier cambio que realice en el Editor durante el modo de reproducción se restablecerá cuando salga del modo de reproducción.

Cada vez que ingresa al modo Reproducir en el Editor, Unity realiza dos acciones importantes:

  • Recarga de dominio: Unity realiza copias de seguridad, descarga y recrea estados de scripts.
  • Recarga de escena: Unity destruye la escena y la carga nuevamente.

Estas dos acciones toman cada vez más tiempo a medida que sus guiones y escenas se vuelven más complejos.

Si no planea realizar más cambios en el script, aproveche la configuración de Ingresar al modo de reproducción (Editar > Configuración del proyecto > Editor) para ahorrar tiempo de compilación. Unity te ofrece la opción de deshabilitar la recarga de dominio, la recarga de escena o ambas. Esto puede acelerar el ingreso y la salida del modo de reproducción.

Simplemente recuerda que si planeas realizar más cambios en el script, deberás volver a habilitar la recarga de dominio. De manera similar, si modifica la jerarquía de escenas, deberá volver a habilitar la recarga de escenas. De lo contrario, pueden surgir comportamientos inesperados.

Los efectos de deshabilitar las configuraciones Recargar dominio y Recargar escena
Controle su compilación con la administración de ensamblajes

Un ensamblaje es una biblioteca de código C#, una colección de tipos y recursos creados para trabajar juntos y formar una unidad lógica de funcionalidad. De forma predeterminada, Unity compila casi todos los scripts de su juego en el ensamblaje predefinido, Assembly-CSharp.dll. Esto funciona bien para proyectos pequeños, pero tiene algunas desventajas:

  • Cada vez que se cambia un script, Unity vuelve a compilar todos los demás scripts.
  • Un script puede acceder a tipos definidos en cualquier otro script.
  • Todos los scripts están compilados para todas las plataformas.

Organizar sus scripts en conjuntos personalizados promueve la modularidad y la reutilización. Evita que se agreguen automáticamente a los ensamblajes predeterminados y limita a qué scripts pueden acceder.

image

Puede dividir su código en varios ensamblajes, como se muestra en el diagrama anterior. Aquí, cualquier cambio en el código en Main no puede afectar el código en Stuff. De manera similar, debido a que la biblioteca no depende de ningún otro ensamble, puedes reutilizar fácilmente el código de la biblioteca en casi cualquier otro proyecto.

Ensamblados en .NET tiene información general sobre los ensamblados en C#. Consulta las definiciones de ensamblajes en la documentación de Unity para obtener más información sobre cómo definir tus propios ensamblajes en Unity.

Utilice plantillas de script para personalizar nuevos scripts

¿Alguna vez te has sorprendido repitiendo los mismos cambios al crear un nuevo script? ¿Agrega instintivamente un espacio de nombres o elimina la función del evento de actualización? Ahórrese unas cuantas pulsaciones de teclas y cree coherencia en todo el equipo configurando la plantilla de guión en su punto de partida preferido.

Cada vez que creas un nuevo script o sombreador, Unity utiliza una plantilla almacenada en

%EDITOR_PATH%\Datos\Recursos\Plantillas de script:

  • Ventanas: C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates
  • Mac: /Applications/Hub/Editor/[version]/Unity/Unity.app/Contents/Resources/ScriptTemplates

La plantilla MonoBehaviour predeterminada es ésta:

81-C# Script-NewBehaviourScript.cs.txt

También hay plantillas para sombreadores, otros scripts de comportamiento y definiciones de ensamblaje.

Para las plantillas de script específicas del proyecto, cree una carpeta Assets/ScriptTemplates y luego copie las plantillas de script en esta carpeta para anular los valores predeterminados.

También puede modificar las plantillas de script predeterminadas directamente para todos los proyectos, pero asegúrese de hacer una copia de seguridad de los originales antes de realizar cualquier cambio.

El archivo Script-NewBehaviourScript.cs.txt original de 81 C# se ve así:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#ROOTNAMESPACEBEGIN#
public class #SCRIPTNAME# : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #NOTRIM#
    }

    // Update is called once per frame
    void Update()
    {
        #NOTRIM#
    }
}
#ROOTNAMESPACEEND#

Es útil tener en mente estas dos palabras clave:

  • #SCRIPTNAME# indica el nombre de archivo ingresado o el nombre de archivo predeterminado (por ejemplo, NewBehaviourScript).
  • #NOTRIM# garantiza que los corchetes contengan una línea de espacio en blanco.

Reinicie el Editor de Unity y sus cambios deberían aparecer cada vez que cree un MonoBehaviour personalizado.

También puedes modificar las otras plantillas de manera similar. Recuerde conservar una copia del original, más las modificaciones, en algún lugar fuera del proyecto Unity para su custodia.

Utilice atributos para personalizar el Inspector y más
image
El script del jugador utiliza varios atributos para crear encabezados, espacios, campos de rango y de varias líneas.

Unity tiene una variedad de atributos que se pueden colocar encima de una clase, propiedad o función para indicar un comportamiento especial. C# contiene nombres de atributos entre corchetes.

A continuación se muestran algunos atributos comunes que puedes agregar a tus scripts:

Esta es sólo una pequeña muestra de los numerosos atributos con los que puedes trabajar. ¿Quierescambiar el nombre de tus variables sin perder sus valores? ¿O invocar alguna lógica sin un GameObject vacío? Consulta la API de scripts para obtener una lista completa de atributos y ver qué es posible.

Incluso puedes crear tu propio PropertyAttribute para definir atributos personalizados para tus variables de script.

Ventanas e inspectores personalizados

Una de las características más poderosas de Unity es su editor extensible. Utilice el paquete UI Toolkit o el modo IMGUI para crear interfaces de usuario de editor, como ventanas e inspectores personalizados.

UI Toolkit tiene un flujo de trabajo similar al desarrollo web estándar. Utilice su lenguaje de marcado inspirado en HTML y XML, UXML, para definir interfaces de usuario y plantillas de UI reutilizables. Luego, aplique Hojas de estilo de Unity (USS) para modificar el estilo visual y los comportamientos de sus IU.

Alternativamente, puede utilizar el modo inmediato, IMGUI, como se mencionó anteriormente. Primero derive de la clase base Editor , luego utilice el atributo CustomEditor .

Cualquiera de las soluciones puede crear un inspector personalizado.

Un editor personalizado modifica cómo aparece el script MyPlayer en el Inspector:

image

Consulta Creación de interfaces de usuario (UI) para obtener más información sobre cómo implementar scripts de editor personalizados utilizando UI Toolkit o IMGUI. Para obtener una introducción rápida a UI Toolkit, mire el tutorial Introducción a los scripts del editor .

Simplifique la gestión de activos con Addressables

El sistema de activos direccionables simplifica la forma en que administras los activos que componen tu juego. Cualquier activo, incluidas escenas, prefabricados, activos de texto, etc., se pueden marcar como “direccionables” y se les puede dar un nombre único. Puedes llamar a este alias desde cualquier lugar.

Agregar este nivel extra de abstracción entre el juego y sus recursos puede agilizar ciertas tareas, como la creación de un paquete de contenido descargable independiente. Este sistema también facilita la referenciación de esos paquetes de activos, ya sean locales o remotos.

image
En este ejemplo, Addressables rastrea el inventario de prefabricados.

Para comenzar, instale el paquete Addressables desde el Administrador de paquetes y agregue algunas configuraciones básicas al proyecto. Cada activo o Prefab del proyecto debe tener la opción de ser “direccionable”. Marque la opción debajo del nombre de un activo en el Inspector para asignarle una dirección única predeterminada.


Imagen
Opción direccionable habilitada con nombre direccionable predeterminado

Una vez marcados, los activos correspondientes aparecerán en la ventana Ventana > Gestión de activos > Addressables > Grupos .

image
En Grupos de Addressables , puedes ver la dirección personalizada de cada activo, junto con su ubicación.

Para mayor comodidad, puede cambiar el nombre de cada dirección en el campo Dirección individual del activo o simplificarlas todas a la vez.

Imagen
Simplifique los nombres direccionables con una sola acción de menú o cámbieles el nombre individualmente.
image
Utilice el script de compilación predeterminado para generar un paquete de activos de grupo direccionable.

Agrupe estos activos para alojarlos en un servidor en otro lugar o distribúyalos localmente dentro de su proyecto. Dondequiera que resida cada activo, el sistema puede localizarlos utilizando la cadena de nombre direccionable.

Ahora puedes usar tus activos direccionables a través de la API de Addressables .

Vale la pena señalar que, sin Addressables, tendría que completar lo siguiente para crear una instancia de un Prefab en su escena:

public GameObject prefabToCreate;

public void CreatePrefab() 
{
    GameObject.Instantiate(prefabToCreate);
}
view rawgistfile1.txt hosted withby GitHub

La desventaja aquí es que cualquier Prefab referenciado (como prefabToCreate) se cargaría en la memoria, incluso si la Escena no lo necesita.

Si utiliza Addressables, haga lo siguiente:

public string prefabByAddress;
public void CreatePrefabWithAddress() 
{
    Addressables.Instantiate(prefabByAddress, instantiationParameters, bool);
}

Esto carga el activo por su cadena de dirección, lo que significa que el Prefab no se carga en la memoria hasta que es necesario (cuando invocamos Adressables.Instantiate dentro de CreatedPrefabWithAddress). Además, puedes usar Addressables para realizar un recuento de referencias de alto nivel, para descargar automáticamente paquetes y sus activos asociados cuando ya no estén en uso.

Cuentos desde las trincheras de la optimización: Ahorrar memoria con Addressables muestra un ejemplo de cómo organizar sus grupos de Addressables para que sean más eficientes en el uso de la memoria. Mientras tanto, el Addressables: Introducción a los conceptos Este tutorial ofrece una descripción general rápida de cómo el sistema de activos direccionables puede funcionar en su proyecto.

Operando juegos en vivo: Cloud Content Delivery con Addressables

Si está operando un juego en vivo, entonces podría considerar usar la solución Cloud Content Delivery (CCD) de Unity con Addressables. El sistema Addressables almacena y cataloga los activos del juego para que puedan localizarse y llamarse automáticamente. Luego, CCD envía esos activos directamente a sus jugadores, completamente separados de su código. Esto reduce el tamaño de tu compilación y elimina la necesidad de que tus jugadores descarguen e instalen nuevas versiones del juego cada vez que realizas una actualización. Para obtener más información, lea este blog sobre la integración entre Addressables y Cloud Content Delivery.

Controlar la compilación con directivas del preprocesador

La función de compilación dependiente de la plataforma le permite particionar sus scripts para compilar y ejecutar código para una plataforma específica.

Este ejemplo hace uso de las directivas #define de la plataforma existente con la directiva del compilador #if :

using UnityEngine;
using System.Collections;

public class PlatformDefines : MonoBehaviour 
{
  void Start () 
  {
    #if UNITY_EDITOR
      Debug.Log("Unity Editor");
    #endif

    #if UNITY_IOS
      Debug.Log("Iphone");
    #endif

    #if UNITY_STANDALONE_OSX
      Debug.Log("Stand Alone OSX");
    #endif

    #if UNITY_STANDALONE_WIN
      Debug.Log("Stand Alone Windows");
    #endif

  }          
}

Utilice el #define DEVELOPMENT_BUILD para identificar si su script se está ejecutando en un reproductor que fue creado con la opción Development Build .

Puede compilar de forma selectiva para versiones particulares de Unity y/o backends de scripting, e incluso proporcionar sus propias directivas #define personalizadas al realizar pruebas en el Editor. Abra el panel Otras configuraciones , parte de la configuración del Reproductor, y navegue hasta Scripting Definir símbolos.

image

Consulte Compilación dependiente de la plataforma para obtener más información sobre las directivas del preprocesador de Unity.

Hacer uso de ScriptableObjects

Un ScriptableObject es un contenedor de datos que guarda grandes cantidades de datos, separados de las instancias de clase. Los objetos ScriptableObjects evitan copiar valores, lo que puede reducir el uso de memoria de su proyecto. Consulte el libro electrónicocompleto para ver algunos ejemplos de cómo utilizar ScriptableObjects. De lo contrario, consulte la documentación de ScriptableObject para obtener más detalles sobre el uso de ScriptableObjects en su aplicación.

¿Buscas aún más? Mire Mejores datos con ScriptablesObjects en Unity para obtener una introducción rápida y ver cómo pueden ayudar con la administración de escenas en Logre un mejor flujo de trabajo de escenas con ScriptableObjects.

Consejo de optimización

Recomendamos formatos de serialización binaria como MessagePack o Protocol Buffers para datos guardados, en lugar de formatos basados en texto, como JSON o XML. En las revisiones de proyectos, estos formatos de serialización binaria reducen los problemas de memoria y rendimiento asociados con estos últimos.

Utilice su IDE preferido

Unity ofrece soporte para los siguientes entornos de desarrollo integrados (IDE):

  • Estudio visual: IDE predeterminado en Windows y macOS
  • Código de Visual Studio: Windows, macOS, Linux
  • JetBrains Rider: Windows, macOS, Linux

Las integraciones IDE para estos tres entornos aparecen como paquetes en el Administrador de paquetes.

image
Integraciones IDE como paquetes

Cuando instala Unity en Windows y macOS, Visual Studio se instala de forma predeterminada. Si desea utilizar otro IDE, simplemente busque el editor en Unity > Preferencias > Herramientas externas > Editor de scripts externos.

Rideris está construido sobre ReSharper e incluye la mayoría de sus características. Admite la depuración de C# en el entorno de ejecución de scripts .NET 4.6 en Unity (C# 8.0). Para obtener más información, consulte la documentación de JetBrains sobre Rider para Unity.

VS Code es un editor de código gratuito y optimizado con soporte para depuración, ejecución de tareas y control de versiones. Tenga en cuenta que Unity requiere Mono (macOS y Linux), Visual Studio Code C#y Visual Studio Code Debugger para Unity (no compatible oficialmente) cuando se usa VS Code.

Cada IDE tiene sus propios méritos. Consulte Compatibilidad con entornos de desarrollo integrados (IDE) para obtener más información sobre cómo elegir el IDE adecuado para sus necesidades.

Eche un vistazo al libro electrónico para obtener una lista de atajos que pueden beneficiar su proyecto y vea consejos y trucos de Visual Studio para aumentar su productividad y lograr más mejoras en el flujo de trabajo con Visual Studio.

¿Estás interesado en explorar JetBrains Rider? Consulta la creación rápida de scripts de C# en Unity con JetBrains Ridero estos consejos sobre cómo usar JetBrains Rider como editor de código.

Depuración en modo de reproducción

El depurador de Unity le permite depurar su código C# mientras la entidad de Unity está en modo de reproducción. Puede adjuntar puntos de interrupción dentro del editor de código para inspeccionar el estado de su código de script y sus variables actuales en tiempo de ejecución.

Vaya a la parte inferior derecha de la barra de estado del editor de Unity para establecer el modo de Optimización de código en Depurar. También puede cambiar este modo al iniciar en Editar > Preferencias > General > Optimización de código al iniciar.

image
Modo de depuración

En el editor de código, establezca un punto de interrupción donde desea que el depurador pause la ejecución. Simplemente haga clic sobre el margen izquierdo/área de medianil donde desea alternar un punto de interrupción (o haga clic derecho allí para ver el menú contextual de otras opciones). Aparecerá un círculo rojo junto al número de línea resaltada (ver imagen a continuación).

image
image
Activar o desactivar un punto de interrupción

Seleccione Adjuntar a Unity en su editor de código, luego ejecute el proyecto en el Editor de Unity .

image
Conectar el depurador a Unity

En el modo de reproducción, la aplicación se detendrá en el punto de interrupción, lo que le dará tiempo para inspeccionar las variables e investigar cualquier comportamiento no deseado.

image
Variables de depuración

Como se muestra arriba, puedes inspeccionar las variables durante la depuración observando cómo se construye la lista, paso a paso, durante la ejecución.

image
Controles de depuración: Continuar con la ejecución, dar un paso adelante, entrar y salir

Utilice los controles Continuar ejecución, Pasar por encima, Entrary Salir para navegar por el flujo de control.

image
Control de depuración: Detener

Presione Detener para detener la depuración y reanudar la ejecución en el Editor.

También puedes depurar código de script en Unity Player. Solo asegúrese de que la compilación de desarrollo y la depuración de scripts estén habilitadas en Archivo > Configuración de compilación antes de compilar el reproductor. Marque Esperar al depurador administrado para esperar al depurador antes de que el reproductor ejecute cualquier código de script. Para conectar el editor de código al Unity Player, seleccione la dirección IP (o el nombre de la máquina) y el puerto de su reproductor. Luego proceda normalmente en Visual Studio con la opción Adjuntar a Unity .

Consejos de depuración adicionales

Unity proporciona una clase Debug para ayudarle a visualizar información en el Editor mientras se ejecuta. Aprenda a imprimir mensajes o advertencias en la ventana de la Consola, a dibujar líneas de visualización en las vistas de Escena y Juego, y a pausar el modo de Reproducción en el Editor desde el script. A continuación le presentamos algunos consejos más para ayudarle a comenzar:

1. Pausar la ejecución con Debug.Break. Esto es útil para verificar ciertos valores en el Inspector cuando es difícil pausar la aplicación manualmente.

2. Debe estar familiarizado con Debug.Log, Debug.LogWarningy Debug.LogError para imprimir mensajes de la consola. También es útil Debug.Assert, que afirma una condición y registra un error en caso de falla. Sin embargo, tenga en cuenta que solo funciona si se define el símbolo UNITY_ASSERTIONS . Registra mensajes, advertencias y errores en la consola.

image
Registra mensajes, advertencias y errores en la consola.

3. Al utilizar Debug.Log, puede pasar un objeto como contexto. Si hace clic en el mensaje en la consola, Unity resaltará el GameObject en la ventana Jerarquía.

4. Utilice texto enriquecido para marcar sus declaraciones Debug.Log . Esto puede ayudarle a mejorar los informes de errores en la consola.

5. Unity no elimina automáticamente las API de registro de depuración de las compilaciones que no son de desarrollo. Envuelva sus llamadas de registro de depuración en métodos personalizados y decórelos con el atributo [Conditional] . Para compilar todos los registros de depuración a la vez, elimine el símbolo de definición de secuencias de comandos correspondiente de la configuración del reproductor. Esto es idéntico a envolverlos en bloques de preprocesador #if… #endif . Consulte esta guía de optimizaciones generales para obtener más detalles.

6. ¿Solución de problemas de física? Debug.DrawLine y Debug.DrawRay pueden ayudarle a visualizar el lanzamiento de rayos.

image
Debug.DrawLine

1. Si solo desea que el código se ejecute mientras la compilación de desarrollo está habilitada, verifique si Debug.isDebugBuild devuelve verdadero.

2. Utilice Application.SetStackTraceLogType, o las casillas de verificación equivalentes en Configuración del reproductor, para decidir qué tipo de mensajes de registro deben incluir seguimientos de pila. Los seguimientos de pila pueden ser útiles, pero son lentos y generan basura.

image
Configure la entrada del registro de la consola según sus preferencias

De forma predeterminada, la entrada del registro de la consola muestra dos líneas. Para mejorar la legibilidad, puedes simplificarlos a una sola línea. Vea cómo a continuación.

Alternativamente, puede utilizar más líneas para entradas más largas.

image
Opciones de entrada del registro de la consola
Personalizar el estado del compilador

Cuando Unity se compila, el ícono en la esquina inferior derecha puede ser difícil de ver. Utilice este script de editor personalizado para llamar a EditorApplication.isCompiling. Esto crea una ventana flotante para que el estado del compilador sea más visible.

Inicie MenuItem para inicializar la ventana. Incluso puedes modificar su apariencia con un nuevo GUIStyle para adaptarlo a tus preferencias.

using UnityEditor;
using UnityEngine;

public class CustomCompileWindow : EditorWindow
{
    [MenuItem("Examples/CustomCompileWindow")]
    static void Init()
    {
        EditorWindow window = GetWindowWithRect(typeof(CustomCompileWindow), new Rect(0, 0, 200, 200));
        window.Show();
    }
   void OnGUI()
    {
        EditorGUILayout.LabelField("Compiling:", EditorApplication.isCompiling ? "Yes" : "No");
       this.Repaint();
    }
}
Control de versión

Unity tiene integraciones con dos sistemas de control de versiones (VCS): Perforce y Plastic SCM. Para configurar los servidores Perforce o Plastic SCM para su proyecto Unity , vaya a Configuración del proyecto > Editor. Configure el servidor (y sus credenciales de usuario para Perforce) en Version Control.

image
Configure su proyecto para utilizar el Version Control.

Los equipos en Unity pueden usar Plastic SCM Cloud Edition de forma gratuita, con hasta 5 GB de almacenamiento y un máximo de tres usuarios. Al utilizar Plastic SCM para Unity, puede sincronizar sus cambios con el trabajo de sus compañeros de equipo y consultar el historial de su proyecto sin tener que salir de Unity. Lea sobre algunas actualizaciones recientes de Plastic SCM aquí.

También puedes utilizar un sistema externo, como Git, incluido Git LFS (Large File Support) para un control de versiones más eficiente de activos más grandes, como recursos gráficos y de sonido. Para mayor comodidad de trabajar con el servicio de alojamiento de GitHub , instale el complemento GitHub para Unity. Esta extensión de código abierto le permite ver el historial de su proyecto, experimentar en ramas, confirmar sus cambios y enviar su código a GitHub, todo dentro de Unity.

Unity mantiene un archivo .gitignore . Esto puede ayudarle a decidir qué debe y qué no debe incluirse en el repositorio de Git y luego aplicar esas reglas.

image
La extensión de GitHub para Unity

Unity Teams es otra opción para agilizar tus flujos de trabajo, ya que te permite almacenar todo tu proyecto en la nube. Esto significa que está respaldado y es accesible desde cualquier lugar, lo que hace que sea mucho más fácil guardar, compartir y sincronizar sus proyectos de Unity con cualquier persona.

Descargue el nuevo libro electrónico sobre productividad

Consulte las dos primeras publicaciones de blog de esta serie: 5 formas de acelerar sus flujos de trabajo en el Editor y Acelere los flujos de trabajo de sus artistas. También puedes descargar gratis la guía70+ consejos para aumentar la productividad con Unity 2020 LTS , que recopila todos los consejos en un práctico libro electrónico.

Como siempre, infórmenos sobre cualquier tema o característica adicional que le gustaría conocer en los comentarios y no dude en compartir sus propios consejos de productividad con la comunidad.