Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход
Разработка платформы Шаг 277 из 387

Справочник по классу 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. Эта функция полезна, если вы хотите временно заморозить свою игру.

Дополнительные ресурсы