AppCallbacks 클래스는 메인 애플리케이션과 Unity 엔진 사이의 브리지 역할을 합니다. 여기서는 AppCallbacks에 대한 호출이 각각 어떤 역할을 하는지 살펴볼 것입니다. 이제 솔루션을 빌드하고 App.xaml.cpp 및 MainPage.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::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);
appCallbacks->SetCoreWindowEvents(Window::Current->CoreWindow);
appCallbacks->InitializeD3DXAML();
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();
});
}
}
m_AppCallbacks = ref new AppCallbacks();
AppCallbacks 클래스를 자세히 살펴보겠습니다. 이 클래스를 생성하면 Unity는 “AppThread”라고 불리는 새로운 스레드를 생성합니다. 그 이유는 Microsoft의 제약에 있습니다. 애플리케이션이 5초 뒤 응답하지 않으면 Windows 애플리케이션 인증인 WACK에 부합하지 못하기 때문입니다. (자세한 내용은 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를 참조하십시오.
커스텀 커맨드 라인 인자를 문자열 배열로 AppCallbacks 생성자에 전달할 수도 있습니다.
참고: InvokeOnAppThread 함수에서 호출되지 않는 한 App.xaml.cpp, MainPage.xaml.c[[에 있는 코드는 항상 UI 스레드에서 실행됩니다.
appCallbacks->SetSwapChainPanel(m_DXSwapChainPanel);
이 코드는 DirectX 11 렌더 타겟으로 사용될 XAML 컨트롤을 Unity에 전달합니다.
appCallbacks->SetCoreWindowEvents(Window::Current->CoreWindow);
Unity의 코어 창을 설정합니다. Unity는 아래의 이벤트에서 정보를 받습니다(리스트에 없는 새로운 이벤트가 있을 수도 있습니다).
appCallbacks->InitializeD3DXAML();
Unity 메인 초기화 함수이며, 아래의 작업을 수행합니다.
이 시점에서 Unity가 첫 레벨 로드를 완료하면 메인 루프에 진입합니다.
애플리케이션 스레드 델리게이트를 호출합니다. UI 스레드에서 스크립트 함수를 실행하고 싶은 경우 유용합니다.
애플리케이션 스레드 델리게이트를 호출합니다. 스크립트에서 XAML 전용 API를 호출하고 싶은 경우 유용합니다.
현재 애플리케이션 스레드에서 실행 중인 경우 true값을 반환합니다.
현재 UI 스레드에서 실행 중인 경우 true값을 반환합니다.
D3D 애플리케이션 초기화 함수입니다.
D3D 애플리케이션이 메인 루프에 진입할 때 사용하는 함수입니다.
첫 레벨이 완전히 로드되면 true값을 반환합니다.
애플리케이션의 커맨드 라인 인자를 설정합니다. nitializeD3DWindow, InitializeD3DXAML이전에 호출되어야 합니다.
애플리케이션 인자를 설정하며, 나중에 Unity API에서 UnityEngine.WSA.Application.arguments를 통해 접근할 수 있습니다.
이 함수는 더 이상 사용되지 않으며 실질적인 기능이 없습니다. Unity 이전 버전에서는 UnityRenderEvent와 같이 콜백의 네이티브 플러그인을 등록하는 데 사용되었습니다. 이제 모든 플러그인은 자동으로 등록됩니다. 함수는 추후 업데이트에서 제거될 예정입니다.
파일에서 커맨드 라인 인자를 분석하며, 이때 인자는 빈 칸으로 분리되어야 합니다.
1을 전달하면 Unity를 일시정지하며, 0을 전달하면 일시정지를 해제합니다. 게임이 끊긴 경우와 같이 게임을 일시정지하고 싶은 경우 유용합니다.
입력을 활성화하거나 비활성화합니다.
Unity가 새로운 입력을 처리하는 경우 true값을 반환합니다.
화상 키보드를 트리거하는 데 사용되는 컨트롤을 설정합니다. 이 컨트롤은 스크립트에서 화상 키보드를 요청하는 경우 단순 포커스를 받게 됩니다. 포커스가 주어지면 키보드를 여는 컨트롤과 동시에 호출되어야 합니다.
현재 키보드 입력을 트리거하는 데 사용되는 컨트롤을 반환합니다. SetKeyboardTriggerControl를 참조하십시오.
시스템 커서를 설정합니다. 설정된 커서는 CoreWindow와 사용되는 경우 독립 입력 소스에 적용됩니다.
시스템 커서를 커스텀으로 설정합니다. 여기서 파라미터는 커서 리소스 ID입니다. 설정된 커서는 CoreWindow와 사용되는 경우 독립 입력 소스에 적용됩니다.