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 закончит загрузку первого уровня, он войдёт в главный цикл.
Вызывает делегат в потоке приложения, полезно когда вы хотите вызвать метод из вашего скрипта в UI потоке.
Вызывает делегат в UI потоке, полезно когда вы хотите вызвать что-то специфичное для XAML API из ваших скриптов.
Возвращает true, если вы в данный момент работаете в потоке приложения.
Возвращает true, если вы в данный момент работаете в UI потоке.
Метод инициализации D3D приложения.
Метод, используемый D3D приложением для входа в главный цикл.
Вернёт true, если первый уровень полностью загружен.
Устанавливает аргумент командной строки для приложения, должен вызываться до 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.
Парсит аргументы командной строки из файла, аргументы должны разделяться символом пробела.
Ставит Unity на паузу, если вы передадите 1, снимает с паузы, если передадите 0, полезно если вы желаете временно заморозить игру, например, для снятия скриншота.
Включает/отключает ввод.
Возвращает true, если Unity будет обрабатывать входящий ввод.
Устанавливает контрол для переключения экранной клавиатуры. Этот контрол будет просто получать фокус при запросе экранной клавиатуры из скриптов. Должно вызываться с контролом, который открывает клавиатуру при фокусировке.
Возвращает контролы, которые в данный момент используется для переключения ввода с клавиатуры. См. SetKeyboardTriggerControl.
Устанавливает системный курсор. Переданный курсор устанавливается и для CoreWindow и для независимого источника ввода (если таковой присутствует).
Меняет системный курсор на пользовательский. Передаваемый параметр – это ID ресурса курсора. Курсор устанавливается и для CoreWindow и для независимого источника ввода (если таковой имеется).