Descripción General
Unity cuenta con una serie de herramientas integradas que nos proporcionan datos de mucha utilidad al momento de analizar el rendimiento de nuestras aplicaciones, así como herramientas que nos ayudan a realizar pruebas y analizar errores surgidos durante el desarrollo, que facilitan y agilizan la resolución de problemas.
Alcances
A continuación se enlistan todas las herramientas para el testing, profiling y debugging con las que cuenta Unity hasta el momento de manera nativa.
Proceso de Desarrollo
Unity Test Runner
Unity Test Runner es una herramienta que permite realizar testing tanto en editor como en modo play, esta herramienta permite desarrollar código integrado a la librería NUnit, librería de código abierto para testing de lenguajes basados en .Net
Unity Test Runner resulta útil par realizar pruebas unitarias de caja blanca, además, con esta herramienta también es posible aplicar Test Driven Development (TDD por sus siglas en inglés) que es una práctica de ingeniería de software que involucra otras dos prácticas: Escribir las pruebas primero (Test First Development) y Refactorización (Refactoring).
¿Cómo utilizar Unity Test Runner?
https://www.youtube.com/watch?v=vLvA7ZkFGRo

Para crear un nuevo script de testing deberemos crear primero nuestro Test Assembly Folder, posteriormente podremos crear nuestro script dentro de la carpeta creada en Editor.

Dentro de un script de testing es posible escribir métodos ejecutables desde la ventana Test Runner, para ello disponemos de dos etiquetas: [Test] y [UnityTest].
La primera nos permite escribir pruebas unitarias para nuestro código, haciendo uso de la clase Assert para comprobar si el valor resultante dentro de una sección de código coincide con un valor esperado, mientras que la segunda nos permite ejecutar código en tiempo de ejecución revisando alguna sección de código en diferentes momentos del tiempo a través de una corrutina.

A continuación se dejan como referencia un par de buenos ejemplos del uso del Unity Test Runner:
1.- http://infalliblecode.com/unity-tdd-1/
2.- https://youtu.be/VqmcWnjreqg
Cloud Diagnostics
Unity Cloud Diagnostics es una suite de herramientas basadas en la nube e integrada dentro de los servicios que proporciona Unity Services que te ayudan a identificar, recopilar y priorizar la retroalimentación reaccionando en tiempo real para mantener enganchados a tus usuarios.
Descubre excepciones en las aplicaciones recopilando automáticamente errores en cualquier plataforma y obteniendo informes en MacOS, iOS, Android y Windows, pudiendo así encontrar y resolver problemas en tiempo real ya que se puede conectar con herramientas como Slack.

Puedes activar este servicio desde la ventana de Services dentro de Unity.

Puede revisar los datos recabados por este servicio en la sección Cloud Diagnostics desde su proyecto en Unity Dashboard.
https://developer.cloud.unity3d.com/projects/

Player log y Editor log
En los archivos de registro de Unity puede obtener información de la compilación y ejecución de su aplicación acerca de todos los acontecimientos ocurridos constituyendo una evidencia del comportamiento del sistema.

Puede acceder a los archivos de registro desde el botón de opciones en la ventana de Consola, o bién en las siguientes rutas dependiendo de su sistema operativo:
Editor Log

Player Log

Unity Profiler
El Unity Profiler es la herramienta principal en Unity para visualizar información detallada sobre cómo se ejecuta cada parte de nuestra aplicación.
Se trata de una poderosa herramienta que nos ofrece un reporte a detalle en tiempo real sobre cada proceso ejecutado sobre el motor al momento de correr nuestra aplicación, ofreciéndonos información que va desde el tiempo en milisegundos que tarda en ejecutarse cierto módulo hasta la cantidad de memoria RAM utilizada para almacenar cierto objeto.
Resulta de gran utilidad al realizar un análisis de rendimiento de la aplicación en desarrollo pues permite identificar problemas de manera puntual y diagnosticar la causa de los mismos agilizando su solución.

Para un uso más detallado del profiler y cada una de sus secciones por favor consulte la siguiente guía: https://unity3d.com/es/learn/tutorials/temas/performance-optimization/diagnosing-performance-problems-using-profiler-window
Frame Debug
Unity Frame Debugger es una herramienta que nos permite visualizar con detalle todas las Draw Calls generadas por nuestra aplicación en Unity, esto incluye tanto las generadas por el render de la cámara como las generadas por una UI.
En particular, cuenta con un depurador de cuadros que se actualizará automáticamente mostrándonos información de cada frame, lo que resulta útil cuando se desea reducir el número de Draw Calls.
Se puede acceder a esta herramienta integrada a través del menú Window en el Editor de Unity, además, es posible utilizarla de manera remota al compilar un Development Build en nuestro dispositivo, al igual que con el Unity Profiler.

Para más información sobre las capacidades del Frame Debugger consulte la siguiente página:
https://docs.unity3d.com/Manual/FrameDebugger.html
Rendering statistics
Unity ofrece la opción de mostrar estadísticas en tiempo real sobre los datos de rendimiento más relevantes de nuestra aplicación, como FPS, número de batches, uso de VRAM, triángulos y conteos de vértices.



Unity Console
La ventana de la consola muestra errores, advertencias y otros mensajes generados por Unity. Para ayudar con la depuración, también puede mostrar sus propios mensajes en la Consola utilizando las funciones Debug.Log, Debug.LogWarning y Debug.LogError.
también se puede cambiar la manera en que los mensajes son mostrados y actualizados en la consola, así como especificar qué tan preciso el stack trace se debería capturar cuando el mensaje log es impreso a la consola o el archivo log.
Esto es especialmente útil cuando el mensaje de error no es muy claro, mirando el stack trace, puede deducir de qué área del motor aparece el error. Hay tres opciones para el registro del stack trace:
- None - el stack trace no será impreso
- ScriptOnly - solamente el stack trace managed será impreso
- Full - ambos stack trace nativo y managed serán impresos

Unity Remote
Unity Remote es una aplicación descargable diseñada para ayudar con el desarrollo de Android, iOS y TVOS. La aplicación se conecta con Unity mientras ejecuta su proyecto en el modo de reproducción desde el Editor de Unity. La salida visual del Editor se envía a la pantalla del dispositivo, y las entradas en vivo se envían nuevamente al proyecto en ejecución en Unity. Esto le permite obtener una buena impresión de cómo su juego realmente se ve y maneja en el dispositivo de destino, sin la molestia de una compilación completa para cada prueba.

Los datos que se transmiten del dispositivo al editor son:
- Input táctil y de lápiz
- Acelerómetro
- Giroscopio
- Streams de la cámara del dispositivo
- Compass
- GPS
- Nombres de Joystick e input
Tenga en cuenta que la aplicación Remota simplemente muestra la salida visual en el dispositivo y toma datos de ella. El procesamiento real del juego aún lo realiza el Editor en la máquina de escritorio, por lo que su rendimiento no es un reflejo perfecto de la aplicación creada.
Memory Profiler
Memory Profiler es una herramienta desarrollada por Unity Technologies que, a pesar de no estar integrada en el editor, resulta de gran utilidad para analizar a fondo el uso de recursos de memoria de nuestra aplicación.
En ocasiones, el Unity Profiler integrado no proporciona información suficiente para llegar al núcleo de muchos problemas de memoria, por otro lado, el memory profiler te permite hacer un snapshot de la memoria brindando una descripción general de la cantidad de memoria utilizada en un momento determinado ampliando así las áreas para obtener una vista más detallada, además, también realiza un seguimiento de los objetos que hacen referencia a la memoria que ha seleccionado.
La diferencia principal entre la sección Memory dentro del Unity Profiler y el Memory Profiler de Unity es que el Unity Profiler integrado analiza el desempeño del código frame por frame mientras que el Memory Profiler analiza toda la memoria RAM que utiliza nuestra aplicación en un determinado momento, ambas herramientas son muy útiles y potentes y se recomienda su uso en conjunto al momento de analizar casos de optimización.
¿Cómo utilizarlo?
- Compila tu proyecto y córrelo en cualquier plataforma.
- Abre el proyecto descargado de: https://bitbucket.org/Unity-Technologies/memoryprofiler/downloads/
- Abre el Unity Profiler y conéctalo a tu aplicación como normalmente lo harías.
- Abre la ventana del Memory Profiler (Window->MemoryProfilerWindow).
- Da clic en "SnapShot" para realizar un escaneo de la memoria RAM.
- Aquí un buen ejemplo de cómo utilizarlo: https://www.youtube.com/watch?v=7B6xRYMzst8

Se adjunta como referencia una conferencia de Unity: “Memory Profiler: La herramienta para solucionar problemas relacionados con la memoria”, que habla sobre los alcances de esta herramienta y su uso de manera más profunda.
https://www.youtube.com/watch?v=5b79ZIQBXsg
Ventajas
- Éstas herramientas están integradas de manera nativa en Unity
- No hace falta descargar ni instalar nada mas
- Son sencillas y rápidas de utilizar
- Facilitan la resolución de errores y problemas de rendimiento
- Son de uso gratuito
Desventajas
- Existen aplicaciones de terceros que son aún más completas
Elaboró
Diego Alberto Tovar Razo