版本:Unity 6 (6000.0)
语言:英语
UWP 的 C# 脚本中的 WinRT API
UWP 的命令行参数

AppCallbacks 类参考

您可以使用 AppCallbacks 类将您的主应用程序连接到 Unity 引擎。

示例:如何使用 AppCallbacks

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(用户界面) 允许用户与您的应用程序交互。 Unity 目前支持三种 UI 系统。 更多信息
参见 词汇表
线程上运行您的应用程序,因为在加载大型应用程序时 UI 可能变得无响应。有关 UI 线程的更多信息,请参阅 Microsoft 关于 保持 UI 线程响应 的文档。

当您使用 m_AppCallbacks = ref new AppCallbacks(); 创建 AppCallbacks 类时,Unity 会创建一个名为 App Thread 的新线程。Unity 创建此新线程是由于 Microsoft 的限制:如果您的应用程序在 5 秒后没有变得响应,您将无法通过 Windows 应用认证工具包测试。有关更多信息,请参阅 Microsoft 关于 Windows 应用认证工具包 的文档。

注意:位于 App.xaml.cppMainPage.xaml.cpp 文件中的代码始终在 UI 线程上运行,除非从 InvokeOnAppThread 函数调用。

命令行参数

您可以将自定义命令行参数作为字符串数组传递到 AppCallbacks 构造函数中。有关更多信息,请参阅 UWP 命令行参数

AppCallbacks 函数

函数 描述
appCallbacks->InitializeD3DXAML(); 初始化您的 DirectX 11 设备并加载第一个关卡。
appCallbacks->SetCoreWindowEvents(Window::Current->CoreWindow); 为 Unity 设置核心窗口。Unity 订阅以下系统事件
- VisibilityChanged
- Closed
- PointerCursor
- SizeChanged
- Activated
- CharacterReceived
- PointerPressed
- PointerReleased
- PointerMoved
- PointerCaptureLost
- PointerWheelChanged
- AcceleratorKeyActivated
appCallbacks->SetSwapChainPanel(m_DXSwapChainPanel); 将 XAML 控件传递给 Unity,该控件用作 DirectX 11 的渲染目标。
void GetSwapChainPanel() 返回 SwapChainPanel 对象,您可以通过 SetSwapChainPanel 方法设置该对象。
void Initialized() 返回引擎是否已初始化到足以运行主游戏循环。
void InitializeD3DWindow() 为 D3D 应用程序初始化引擎图形、DirectX 以及游戏手柄和操纵杆输入。
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() 如果您当前正在 UI 线程中运行,则返回 true。
void SetAppArguments(string arg) / string GetAppArguments() 设置您的应用程序参数,然后您可以从 UnityEngine.WSA.Application.arguments 访问这些参数。
void SetCoreApplicationViewEvents() 订阅 CoreApplicationView::Activated 事件并加载 IL2CPPUnity 开发的脚本后端,您可以在为某些平台构建项目时将其用作 Mono 的替代方案。 更多信息
参见 词汇表
脚本后端一个支持 Unity 中脚本的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台仅支持两种:.NET 和 IL2CPP。 更多信息
参见 词汇表
和除图形之外的所有引擎子系统。
bool UnityGetInput() 如果 Unity 处理传入的输入,则返回 true。
void UnitySetInput(bool enabled) 启用或禁用输入处理。
bool UnityPause(int pause) 如果您传递 1 则暂停 Unity,如果您传递 0 则取消暂停。此函数在您要暂时冻结游戏时很有用。

其他资源

UWP 的 C# 脚本中的 WinRT API
UWP 的命令行参数