Version: 2017.1
Universal Windows Platform: Association launching
Universal Windows Platform: WinRT API in C# scripts

Clase AppCallbacks

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) :

  • VisibilityChanged
  • Closed
  • PointerCursor
  • SizeChanged
  • Activated
  • CharacterReceived
  • PointerPressed
  • PointerReleased
  • PointerMoved
  • PointerCaptureLost
  • PointerWheelChanged
  • AcceleratorKeyActivated

appCallbacks.InitializeD3DXAML();

Esta es la función de inicialización principal para Unity, hace las siguientes cosas:

  • Parse argumentos de la linea de comando, configurados por AppCallbacks.AddCommandLineArg()
  • Inicializa el dispositivo DirectX 11
  • Carga el primer nivel

En este punto, cuando Unity termina de cargar el primer nivel, ingresa al bucle principal.

Otras funciones

  • void InvokeOnAppThread(AppCallbackItem item, bool waitUntilDone)

Invoca un delegate en el thread de la aplicación, útil cuando quiere llamar su función script desde el UI thread.

  • void InvokeOnUIThread(AppCallbackItem item, bool waitUntilDone)

Invoca un delegate en el UI thread, útil cuando quiere invocar algo a una API específica de XAML desde sus scripts.

  • bool RunningOnAppThread()

Devuelve true, si actualmente está ejecutando en el application thread.

  • bool RunningOnUIThread()

Devuelve true, si actualmente está ejecutando en el thread UI.

  • void InitializeD3DWindow()

Función de inicialización para una aplicación D3D.

  • void Run()

Función utilizada por una aplicación D3D, para ingresar en el main loop (bucle principal).

  • bool IsInitialized()

Devuelve true, cuando el primer nivel haya terminado de cargar.

  • void AddCommandLineArg(string arg)

Configura los argumentos de linea de comando para la aplicación, se deben llamar antes de InitializeD3DWindow, InitializeD3DXAML.

  • void SetAppArguments(string arg) / string GetAppArguments()

Configura los argumentos de la aplicación, que luego se pueden acceder desde la Unity API - UnityEngine.WSA.Application.arguments.

  • void LoadGfxNativePlugin(string pluginFileName)

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.

  • void ParseCommandLineArgsFromFiles(string fileName)

Parse argumentos de linea de comando de un archivo, los argumentos deben estar separados por espacios blancos.

  • bool UnityPause(int pause)

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.

  • void UnitySetInput(bool enabled)

Habilita/Desactiva el input.

  • bool UnityGetInput()

Devuelve true, si Unity va a procesar input entrante.

  • void SetKeyboardTriggerControl(Windows.UI.Xaml.Controls.Control ctrl)

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.

  • Windows.UI.Xaml.Controls.Control GetKeyboardTriggerControl()

Devuelve control el control actualmente utilizado para activar input del teclado. Mirar SetKeyboardTriggerControl.

  • void SetCursor(Windows.UI.Core.CoreCursor cursor)

Configura el cursor del sistema. El cursor dado se configura para ambas fuentes de input (si se utilizan) CoreWindow e independientes.

  • void SetCustomCursor(unsigned int id)

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.

Universal Windows Platform: Association launching
Universal Windows Platform: WinRT API in C# scripts