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 подписывается на следующие события (их может быть больше, в зависимости от того, когда эта информация обновлена):
appCallbacks.InitializeD3DXAML();
Это основной метод инициализации для Unity, он совершает следующие действия:
На этой стадии, когда Unity закончит загрузку первого уровня, он войдёт в главный цикл.
Invokes a delegate on application thread, useful when you want to call your script function from UI thread.
Invokes a delegate on UI thread, useful when you want to invoke something XAML specific API from your scripts.
Returns true, if you’re currently running in application thread.
Returns true, if you’re currently running in UI thread.
Initialization function for D3D application.
Function used by D3D application, for entering main loop.
Returns true, when first level is fully loaded.
Sets a command line argument for application, must be called before InitializeD3DWindow, InitializeD3DXAML.
Sets application arguments, which can be later accessed from Unity API - UnityEngine.WSA.Application.arguments.
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.
Parses command line arguments from a file, arguments must be separated by white spaces.
Pauses Unity if you pass 1, unpauses if you pass 0, useful if you want to temporary freeze your game, for ex., when your game is snapped.
Enables/Disables input.
Returns true, if Unity will process incoming input.
Sets the control to be used for triggering on screen keyboard. This control will simply receive focus, when on screen keyboard is requested in scripts. Should be called with control, that does open keyboard on focus.
Returns control, currently used control for triggering keyboard input. See SetKeyboardTriggerControl.
Sets system cursor. The given curosr is set for both CoreWindow and independent input source (if used).
Sets system cursor to custom. Parameter is cursor resource ID. Cursor is set for both CoreWindow and independent input source (if used).