Usted podría llamarlo un puente entre su aplicación principal y el motor de Unity. Aquí intentaremos explicar lo que cada llamada a AppCallbacks hace exactamente. Construyamos una solución y exploremos el archivo App.xaml.cs, que se crea si utiliza el .NET Scripting Backend.
sealed partial class App : Application
{
private WinRTBridge.WinRTBridge _bridge;
private AppCallbacks appCallbacks;
public App()
{
this.InitializeComponent();
appCallbacks = new AppCallbacks(false);
}
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
var mainPage = new MainPage();
Window.Current.Content = mainPage;
Window.Current.Activate();
_bridge = new WinRTBridge.WinRTBridge();
appCallbacks.SetBridge(_bridge);
appCallbacks.SetSwapChainBackgroundPanel(mainPage.GetSwapChainBackgroundPanel());
appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow);
appCallbacks.InitializeD3DXAML();
}
Window.Current.Activate();
}
}
private WinRTBridge.WinRTBridge _bridge;
Primero que todo, qué es WinRTBridge, se utiliza internamente por Unity, para realizar algunas operaciones native-to-managed, managed-to-native, no tiene el propósito que se utilice por desarrolladores. Debido a algunas restricciones de la plataforma WinRT, no se puede crear desde código del motor de Unity, esta es la razón por la cual se está creando WinRTBridge aquí y se pasa al motor de Unity mediante el appCallbacks.SetBridge(_bridge) más bien.
appCallbacks = new AppCallbacks(false);
Ahora, miremos un poco más la clase AppCallbacks. Cuando usted la crea, usted específica que su juego se ejecutará en un thread diferente, por razones de compatibilidad con versiones anteriores, también puede especificar que su aplicación se puede ejecutar en un UI thread, pero esto no se recomienda, ya que hay una restricción de Microsoft - si su aplicación no se responde después de 5 segundos no podrá pasar WACK (Windows Application Certification), leer más aquí - http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh184840(v=vs.105).aspx, imagine que su primer nivel es bastante grande, puede tomar una gran cantidad de tiempo cargarlo, ya que su aplicación está ejecutándose en el UI thread, el UI será no responsivo hasta que su nivel se haya cargado completamente. Esta es la razón por la cual se recomienda ejecutar su juego en un thread diferente.
Lea más acerca del UI thread aquí - http://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx
Tenga en cuenta: El código ubicado en App.xaml.cs, MainPage.xaml.cs siempre está ejecutándose en el UI thread, al menos de que se llame desde la función InvokeOnAppThread.
appCallbacks.SetSwapChainBackgroundPanel(mainPage.GetSwapChainBackgroundPanel());
Esto simplemente pasa un control XAML a Unity que será utilizado como un objetivo de render para DirectX 11.
appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow);
Configura el core window para Unity, Unity se suscribe a los siguientes eventos (puede haber más, dependiendo cuando esta información fue actualizada) :
appCallbacks.InitializeD3DXAML();
Esta es la función de inicialización principal para Unity, hace las siguientes cosas:
En este punto, cuando Unity termina de cargar el primer nivel, ingresa al bucle principal.
Invoca un delegate en el thread de la aplicación, útil cuando quiere llamar su función script desde el UI thread.
Invoca un delegate en el UI thread, útil cuando quiere invocar algo a una API específica de XAML desde sus scripts.
Devuelve true, si actualmente está ejecutando en el application thread.
Devuelve true, si actualmente está ejecutando en el thread UI.
Función de inicialización para una aplicación D3D.
Función utilizada por una aplicación D3D, para ingresar en el main loop (bucle principal).
Devuelve true, cuando el primer nivel haya terminado de cargar.
Configura los argumentos de linea de comando para la aplicación, se deben llamar antes de InitializeD3DWindow, InitializeD3DXAML.
Configura los argumentos de la aplicación, que luego se pueden acceder desde la Unity API - UnityEngine.WSA.Application.arguments.
Esta función es obsoleta y no hace nada. En versiones anteriores de Unity, se necesitaba para registrar los plugins nativos para callbacks como UnityRenderEvent. Todos los plugins ahora están registrados automáticamente. Esta función será quitada en una actualización futura.
Parse argumentos de linea de comando de un archivo, los argumentos deben estar separados por espacios blancos.
Pausa Unity si usted pasa un 1, reanuda si pasa 0, útil si quiere congelar temporalmente su juego, por ejemplo., cuando su juego es snapped.
Habilita/Desactiva el input.
Devuelve true, si Unity va a procesar input entrante.
Configura el control que se utilizará para activar el teclado en pantalla. Este control simplemente recibirá enfoque, cuando el teclado en pantalla se solicite en scripts. Se debe llamar con control, que abra el teclado en foco.
Devuelve control el control actualmente utilizado para activar input del teclado. Mirar SetKeyboardTriggerControl.
Configura el cursor del sistema. El cursor dado se configura para ambas fuentes de input (si se utilizan) CoreWindow e independientes.
Configura el cursor del sistema a custom (personalizado). El parámetro es el ID de recursos del cursos. El cursor se configura para ambas fuentes de input (si se utilizan) CoreWindow e independientes.