您可以使用 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.cpp
和 MainPage.xaml.cpp
文件中的代码始终在 UI 线程上运行,除非从 InvokeOnAppThread
函数调用。
您可以将自定义命令行参数作为字符串数组传递到 AppCallbacks 构造函数中。有关更多信息,请参阅 UWP 命令行参数。
函数 | 描述 |
---|---|
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 则取消暂停。此函数在您要暂时冻结游戏时很有用。 |