Справочник по классу AppCallbacks
Вы можете использовать AppCallbacks класс, чтобы связать основное приложение с движком Unity.
Пример: Как использовать AppCallbacks class
Файл App.xaml.cpp
App::App()
{
InitializeComponent();
SetupOrientation();
m_AppCallbacks = ref new AppCallbacks();
}
void App::OnLaunched(LaunchActivatedEventArgs^ e)
{
m_SplashScreen = e->SplashScreen;
InitializeUnity(e->Arguments);
}
void App::InitializeUnity(String^ args)
{
ApplicationView::GetForCurrentView()->SuppressSystemOverlays = true;
m_AppCallbacks->SetAppArguments(args);
auto rootFrame = safe_cast<Frame^>(Window::Current->Content);
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == nullptr && !m_AppCallbacks->IsInitialized())
{
rootFrame = ref new Frame();
Window::Current->Content = rootFrame;
#if !UNITY_HOLOGRAPHIC
Window::Current->Activate();
#endif
rootFrame->Navigate(TypeName(MainPage::typeid ));
}
Window::Current->Activate();
}
Файл MainPage.xaml.cpp
MainPage::MainPage()
{
m_SplashScreenRemovalEventToken.Value = 0;
m_OnResizeRegistrationToken.Value = 0;
InitializeComponent();
NavigationCacheMode = ::NavigationCacheMode::Required;
auto appCallbacks = AppCallbacks::Instance;
bool isWindowsHolographic = false;
#if UNITY_HOLOGRAPHIC
// If application was exported as Holographic check if the device actually supports it
// Otherwise, we treat this as a normal XAML application
isWindowsHolographic = AppCallbacks::IsMixedRealitySupported();
#endif
if (isWindowsHolographic)
{
appCallbacks->InitializeViewManager(Window::Current->CoreWindow);
}
else
{
m_SplashScreenRemovalEventToken = appCallbacks->RenderingStarted += ref new RenderingStartedHandler(this, &MainPage::RemoveSplashScreen);
appCallbacks->SetSwapChainPanel(m_DXSwapChainPanel);
// Subscribes to all needed system events
appCallbacks->SetCoreWindowEvents(Window::Current->CoreWindow);
// This is the main initialization function for Unity
// Initializes engine graphics, DirectX, and gamepad and joystick input
// Loads IL2CPP and all engine subsystems except graphics
appCallbacks->InitializeD3DXAML();
// At this point, when Unity finishes loading the first level, it enters the main loop.
m_SplashScreen = safe_cast<App^>(App::Current)->GetSplashScreen();
auto dispatcher = CoreWindow::GetForCurrentThread()->Dispatcher;
ThreadPool::RunAsync(ref new WorkItemHandler([this, dispatcher](IAsyncAction^)
{
GetSplashBackgroundColor(dispatcher);
}));
OnResize();
m_OnResizeRegistrationToken = Window::Current->SizeChanged += ref new WindowSizeChangedEventHandler([this](Object^, WindowSizeChangedEventArgs^)
{
OnResize();
});
}
}
Создание потока приложения
Unity не запускает приложение на потоке UI, поскольку поток UI может перестать отвечать при загрузке крупных приложений. Дополнительные сведения о потоках UI см. в документации Microsoft по Поддержание потока UI реагирующим.
Когда вы создаете AppCallbacks класс с помощью m_AppCallbacks = ref new AppCallbacks();, Unity создает новый поток, называемый App Thread. Unity создает этот новый поток из-за ограничения Microsoft: если ваше приложение не становится реагирующим после 5 секунд, вы не сможете пройти тесты Windows App Certification Kit. Для получения дополнительной информации, см. документацию Microsoft на Windows Комплект для сертификации приложений.
Примечание: Код, расположенный в файлах App.xaml.cpp и MainPage.xaml.cpp, всегда выполняется на потоке UI, если только он не вызван из функции InvokeOnAppThread.
Аргументы командной строки
Пользовательские аргументы командной строки можно передавать в конструктор AppCallbacks в виде строковых массивов. Дополнительные сведения см. в UWP Аргументы командной строки.
Функции AppCallbacks
| Функция | Описание |
|---|---|
appCallbacks->InitializeD3DXAML(); |
Инициализирует ваше устройство DirectX 11 и загружает первый уровень. |
appCallbacks->SetCoreWindowEvents(Window::Current->CoreWindow); |
Задает основное окно для Unity. Unity подписывается на следующие системные события: — VisibilityChanged - Закрыто - PointerCursor - SizeChanged - Активировано - CharacterReceived - PointerPressed - PointerReleased - PointerMoved - PointerCaptureLost - PointerWheelChanged - AcceleratorKeyActivated |
appCallbacks->SetSwapChainPanel(m_DXSwapChainPanel); |
Передаёт XAML контроллер Unity, который используется в качестве цели рендеринга для DirectX 11. |
void GetSwapChainPanel() |
Возвращает объект SwapChainPanel, который можно установить с помощью метода SetSwapChainPanel. |
void Initialized() |
Возвращает информацию о том, достаточно ли инициализован движок для запуска цикла основной игры. |
void InitializeD3DWindow() |
Инициализирует графику движка, DirectX, и ввод геймпада и джойстика для D3D приложений. |
void Instance() |
Получает одиночный экземпляр ранее созданного объекта AppCallbacks. |
void InvokeOnAppThread(AppCallbackItem item, bool waitUntilDone) |
Вызов делегата в потоке приложения. Эта функция полезна, когда вы хотите выполнить функцию скрипта из потока UI. |
void InvokeOnUIThread(AppCallbackItem item, bool waitUntilDone) |
вызывает делегата на UI Эта функция полезна, когда вы хотите вызвать поток, XAML-специфические API из ваших скриптов. |
bool IsInitialized() |
Возвращает true, когда первый уровень приложения полностью загружен. |
void RenderingStarted() |
Начинается после того, как Unity отобразит свой первый кадр. |
void Run() |
Разрешает приложениям D3D входить в главный цикл. |
bool RunningOnAppThread() |
Возвращает true, если в настоящее время выполняется в потоке приложения. |
bool RunningOnUIThread() |
Возвращает true, если вы работаете в потоке UI. |
void SetAppArguments(string arg) / string GetAppArguments() |
Устанавливает аргументы приложения, к которым можно получить доступ из UnityEngine.WSA.Application.arguments. |
void SetCoreApplicationViewEvents() |
Подписывается на событие CoreApplicationView::Activated и загружает IL2CPP скриптовую базу данных и все подсистемы движка, кроме графических. |
bool UnityGetInput() |
Возвращает true, если Unity обрабатывает входящий вход. |
void UnitySetInput(bool enabled) |
Включает или отключает обработку ввода. |
bool UnityPause(int pause) |
Пауза Unity, если вы проходите 1 и разблокирует, если вы проходите 0. Эта функция полезна, если вы хотите временно заморозить свою игру. |
Дополнительные ресурсы
- Документация Майкрософт о поддержании потока UI чувствительным
- UWP Аргументы командной строки
- Аргументы командной строки