Version: 5.3 (switch to 5.4b)
Windows Store Apps: Запуск с сопоставлением
Приложения Windows Store: WinRT API в C# скриптах

Класс AppCallbacks

You could call it a bridge between your main application and Unity engine. Here, we’ll try to explain what every call to AppCallbacks exactly does. Let’s build solution and explore App.xaml.cs file, which gets created if you use .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;

Сперва, что такое WinRTBridge. Он используется в недрах Unity для совершения некоторых native-to-managed, managed-to-native операций, он не предназначен для использования разработчиками. Из-за некоторых ограничений платформы WinRT, он не может быть создан из кода движка Unity, вот почему вместо этого WinRTBridge был создан здесь и передаётся движку Unity через appCallbacks.SetBridge(_bridge).

appCallbacks = new AppCallbacks(false);

Теперь давайте поближе рассмотрим класс AppCallbacks. Когда вы его создаёте, вы указываете, что ваша игра будет работать в другом потоке. Для обратной совместимости вы также можете указать, что ваше приложение может работать в потоке UI, но это делать не рекомендуется, т.к. существует ограничение от Microsoft - если ваше приложение не будет отвечать в течение первых 5 секунд, вы не сможете пройти WACK (Windows Application Certification), читайте подробнее здесь - http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh184840(v=vs.105).aspx. Представьте, что ваш первый уровень довольно большой и требуется приличное количество времени для его загрузки, но т.к. ваше приложение работает в UI потоке, UI не будет отвечать до тех пор, пока ваш уровень полностью не загрузится. Вот почему рекомендуется всегда запускать вашу игру в другом потоке.

Дополнительная информация про UI поток доступна здесь - http://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx

Note: Code located in App.xaml.cs, MainPage.xaml.cs is always running on UI thread, unless called from InvokeOnAppThread function.

appCallbacks.SetSwapChainBackgroundPanel(mainPage.GetSwapChainBackgroundPanel());

Эта строка просто передаёт XAML контрол в Unity, который будет использован для вывода рендера DirectX 11.

appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow);

Устанавливает основное окно для Unity, Unity подписывается на следующие события (их может быть больше, в зависимости от того, когда эта информация обновлена):

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

appCallbacks.InitializeD3DXAML();

Это основной метод инициализации для Unity, он совершает следующие действия:

  • Parse command line arguments, set by AppCallbacks.AddCommandLineArg()
  • Инициализирует DirectX 11 устройство
  • Загружает первый уровень

На этой стадии, когда Unity закончит загрузку первого уровня, он войдёт в главный цикл.

Остальные методы

  • void InvokeOnAppThread(AppCallbackItem item, bool waitUntilDone)

Вызывает делегат в потоке приложения, полезно когда вы хотите вызвать метод из вашего скрипта в UI потоке.

  • void InvokeOnUIThread(AppCallbackItem item, bool waitUntilDone)

Вызывает делегат в UI потоке, полезно когда вы хотите вызвать что-то специфичное для XAML API из ваших скриптов.

  • bool RunningOnAppThread()

Возвращает true, если вы в данный момент работаете в потоке приложения.

  • bool RunningOnUIThread()

Возвращает true, если вы в данный момент работаете в UI потоке.

  • void InitializeD3DWindow()

Метод инициализации D3D приложения.

  • void Run()

Метод, используемый D3D приложением для входа в главный цикл.

  • bool IsInitialized()

Вернёт true, если первый уровень полностью загружен.

  • void AddCommandLineArg(string arg)

Устанавливает аргумент командной строки для приложения, должен вызываться до InitializeD3DWindow, InitializeD3DXAML.

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

Sets application arguments, which can be later accessed from Unity API - UnityEngine.WSA.Application.arguments.

  • void LoadGfxNativePlugin(string pluginFileName)

This function is obsolete and does nothing. In previous versions of Unity, this was needed to register native plugins for callbacks such as UnityRenderEvent. All plugins are now registered automatically. This function will be removed in a future update.

  • void ParseCommandLineArgsFromFiles(string fileName)

Парсит аргументы командной строки из файла, аргументы должны разделяться символом пробела.

  • bool UnityPause(int pause)

Ставит Unity на паузу, если вы передадите 1, снимает с паузы, если передадите 0, полезно если вы желаете временно заморозить игру, например, для снятия скриншота.

  • void UnitySetInput(bool enabled)

Включает/отключает ввод.

  • bool UnityGetInput()

Возвращает true, если Unity будет обрабатывать входящий ввод.

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

Устанавливает контрол для переключения экранной клавиатуры. Этот контрол будет просто получать фокус при запросе экранной клавиатуры из скриптов. Должно вызываться с контролом, который открывает клавиатуру при фокусировке.

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

Возвращает контролы, которые в данный момент используется для переключения ввода с клавиатуры. См. SetKeyboardTriggerControl.

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

Устанавливает системный курсор. Переданный курсор устанавливается и для CoreWindow и для независимого источника ввода (если таковой присутствует).

  • void SetCustomCursor(unsigned int id)

Меняет системный курсор на пользовательский. Передаваемый параметр – это ID ресурса курсора. Курсор устанавливается и для CoreWindow и для независимого источника ввода (если таковой имеется).

Windows Store Apps: Запуск с сопоставлением
Приложения Windows Store: WinRT API в C# скриптах