Entender la Gestión Automática de Memoria
Funciones genéricas

Compilación Dependiente a la Plataforma

Unity incluye una característica llamada “Platform Dependent Compilation”. Esta consiste de algunas directivas preprocessor que le permiten partir sus scripts para compilar y ejecutar una sección de código exclusivamente para una de las plataformas soportadas.

Usted puede correr este código dentro del Editor de Unity, para que pueda compilar el código específicamente para su plataforma destino y probarlo en el Editor!

Directivas de #Defines de plataforma

Las directivas de #defines de plataforma que soporta Unity para sus scripts son:

Propiedad: Función:
UNITY_EDITOR Directiva #define para llamar los scripts del Editor de Unity desde su código de juego.
UNITY_EDITOR_WIN Directiva #define de Plataforma para código de editor en Windows.
UNITY_EDITOR_OSX Directiva #define para código del Editor en Mac OSX.
UNITY_STANDALONE_OSX Directiva #define de Plataforma para la compilación/ejecución de código específicamente para Mac OS (esto incluye arquitecturas Universal, PPC e Intel).
UNITY_STANDALONE_WIN Directiva #define para compilar/ejecutar código para aplicaciones stand alone de Windows.
UNITY_STANDALONE_LINUX Directiva #define para compilar/ejecutar código para aplicaciones stand alone Linux.
UNITY_STANDALONE Directiva #define para compilar/ejecutar código para cualquier plataforma standalone (Mac, Windows, o Linux).
UNITY_WII Directiva #define Define para la compilación/ejecución de código para la consola Wii.
UNITY_IOS Directiva #define para la compilación/ejecución de código para la plataforma iOS.
UNITY_IPHONE Deprecado. Utilice UNITY_IOS más bien.
UNITY_ANDROID Directiva #define para la plataforma Android.
UNITY_PS3 Directiva #define para correr código de Playstation 3.
UNITY_PS4 Directiva #define para correr código de Playstation 4.
UNITY_SAMSUNGTV Directiva #define para la ejecución de código de Samsung TV.
UNITY_XBOX360 Directiva #define para la ejecución de código de Xbox 360.
UNITY_XBOXONE Directiva #define para la ejecución de código de Xbox One.
UNITY_TIZEN Directiva #define para la plataforma Tizen.
UNITY_TVOS Directiva #define para la plataforma Apple TV.
UNITY_WP_8 Directiva #define para Windows Phone 8.
UNITY_WP_8_1 Directiva #define para Windows Phone 8.1.
UNITY_WSA Directiva #define para Windows Store Apps. Adicionalmente, NETFX_CORE se define cuando se compila archivos C# contra .NET Core.
UNITY_WSA_8_0 Directiva #define para Windows Store Apps cuando se apunte a SDK 8.0.
UNITY_WSA_8_1 Directiva #define para Windows Store Apps cuando se apunte a SDK 8.1.
UNITY_WSA_10_0 Directiva #define para Windows Store Apps cuando se apunte Universal Windows 10 Apps. Adicionalmente WINDOWS_UWP y NETFX_CORE son definidas cuando se compile archivo C# contra .NET Core.
UNITY_WINRT Equivalente a UNITY_WP_8 | UNITY_WSA.
UNITY_WINRT_8_0 Equivalente a UNITY_WP_8 | UNITY_WSA_8_0.
UNITY_WINRT_8_1 Equivalente a UNITY_WP_8_1 | UNITY_WSA_8_1. También se define cuando se compile contra Universal SDK 8.1.
UNITY_WINRT_10_0 Equivalente a UNITY_WSA_10_0
UNITY_WEBGL Directiva #define para WebGL.
UNITY_ADS Directiva #define para llamar métodos de Unity Ads de su código de juego. Versiones 5.2 y posterior.
UNITY_ANALYTICS Directiva #define para llamar métodos de Unity Analytics para su código de juego. Versión 5.2 y posterior.
UNITY_ASSERTIONS Directiva #define para el proceso para controlar aserciones.

Desde Unity 2.6.0 y posterior, usted puede compilar código selectivamente. Las opciones disponibles dependen de la versión del Editor donde esté trabajando. Dado un número de versión X.Y.Z (por ejemplo, 2.6.0), Unity expone tres directivas #define globales en los siguientes formatos: UNITY_X, UNITY_X_Y y UNITY_X_Y_Z.

Aquí hay un ejemplo de las directivas #define expuestas en Unity 5.0.1:

UNITY_5 Directiva #define para la versión de lanzamiento para Unity 5, expuesto en cada lanzamiento 5.x.y .
UNITY_5_0 Directiva #define para la versión mayor de Unity 5.0, expuesto en cada lanzamiento 5.0.z .
UNITY_5_0_1 Directiva #define para la versión menor de Unity 5.0.1.

Usted puede compilar código selectivamente basado en la versión más temprana de Unity requerida para compilar o ejecutar una porción dada de código. Dado el mismo formato de la versión de arriba (X.Y.Z), Unity expone una directiva #define global que puede ser utilizada para este propósito, en el formato UNITY_X_Y_OR_NEWER.

Las directivas #define soportadas son:

UNITY_5_3_OR_NEWER Directiva #define expuesta empezando desde Unity 5.3.

Usted también puede compilar el código selectivamente dependiendo del back-end de scripting.

ENABLE_MONO Directiva #define de scripting back-end para Mono.
ENABLE_IL2CPP Directiva #define de scripting de back-end para IL2CPP.
ENABLE_DOTNET Directiva #define para .NET.

Usted puede también utilizar la directiva define DEVELOPMENT_BUILD para identificar si su script está corriendo en un reproductor que fue construido con la opción “Development Build” habilitada.

Probando código pre-compilado

Abajo hay un ejemplo de cómo utilizar el código pre-compilado. Imprime un mensaje que depende en la plataforma que usted ha seleccionado para su objetivo de construcción.

Primero que todo, seleccione la plataforma en la cual usted quiere probar su código al click en File > Build Settings. Esto va a traer la ventana los ajustes Build Settings para seleccionar su plataforma deseada.

La ventana de los Ajustes con el WebPlayer seleccionada como la plataforma deseada.
La ventana de los Ajustes con el WebPlayer seleccionada como la plataforma deseada.

Seleccione la plataforma con la cual usted quiere probar su código pre-compilado y haga click en Swith Platform para decirle a Unity a qué plataforma le está apuntando.

Cree un script y copie/pegue el siguiente código:

// JS
function Awake() {
  #if UNITY_EDITOR
    Debug.Log("Unity Editor");
  #endif
    
  #if UNITY_IPHONE
    Debug.Log("Iphone");
  #endif

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

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


// C#
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

  }          
}


Para probar el código, haga click en el Play Mode. Confirme que el código funciona al revisar por mensajes relevantes en la consola de Unity, dependiendo en qué plataforma ha seleccionado - por ejemplo, si usted escoge iOS, se configura que el mensaje “Iphone” aparezca en la consola.

Tenga en cuenta que en C# usted puede utilizar un atributo CONDITIONAL el cual es más limpio, una manera de stripping out funciones que sea menos propicia a los errores. Ver http://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx para más información.

Adicionalmente a la directiva del compilador básica #if, usted puede utilizar también una prueba multiway en C# y JavaScript:


#if UNITY_EDITOR
    Debug.Log("Unity Editor");

#elif UNITY_IOS
    Debug.Log("Unity iPhone");

#else
    Debug.Log("Any other platform");

#endif


Defines de plataforma personalizados

También es posible agregar la selección integrada de directivas #define al proporcionar sus propias. En el panel Other Settings de los Player Settings, usted verá la casilla de texto Scripting Define Symbols.

Ingrese los nombres de los símbolos que usted quiere definir para esa plataformas en particular separado por puntos y comas. Estos símbolos luego pueden ser utilizados como las condiciones para las directivas #if, como las integradas.

Defines Global personalizadas

Usted puede definir sus propias directivas pre-processor para controlar qué código es incluido cuando se compila. Para hacer esto usted debe agregar un archivo de texto con las directivas extras a la carpeta Assets. El nombre del archivo depende en el lenguaje que usted esté utilizando. La extensión es .rsp:

C# <Project Path>/Assets/smcs.rsp
C# - Scripts del Editor <Project Path>/Assets/gmcs.rsp
UnityScript <Project Path>/Assets/us.rsp

Como un ejemplo, si usted incluye la sola linea -define:UNITY_DEBUG en su archivo smcs.rsp, la directiva #define UNITY_DEBUG va a existir como un #define global para sus scripts C#, excepto para scripts del editor.

Cada vez que usted hace algún cambio a los archivos .rsp, usted tiene que re-compilar para que sean efectivos. Usted puede hacer esto al actualizar o re-importar un solo archivo script (.js o .cs).

RECOMENDACIÓN

Si usted quiere modificar solamente directivas #define globales, utilice Scripting Define Symbols en los Player Settings, ya que esto cubre todos los compiladores. Si usted escoge los archivos .rsp más bien, usted necesitará proporcionar un solo archivo por cada compilador que Unity utilice, y no sabrá cuándo uno u otro compilador fue usado.

El uso de los archivos .rsp_ se describe en la sección ‘Help’ de la aplicación smcs la cual fue incluida en la carpeta de instalación del editor. Usted puede obtener más información al correr smcs -help.

Tenga en cuenta que los archivos .rsp necesitan coincidir el compilador que es invocado. Por ejemplo:

  • cuando se apunte al web player, el smcs es utilizado con smcs.rsp,
  • cuando se apunte a reproductores standalone, gmcs se utiliza con gmcs.rsp, y
  • cuando se apunte a un compilador MS , csc se utiliza con csc.rsp, etc.
Entender la Gestión Automática de Memoria
Funciones genéricas