Version: 2023.1
언어: 한국어
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가 응답하지 않을 수 있으므로 UI 스레드에서 앱을 실행하지 않습니다.UI 스레드에 대한 자세한 내용은 UI 스레드 응답성 유지에 대한 Microsoft의 문서를 참조하십시오.

m_AppCallbacks = ref new AppCallbacks();를 사용하여 AppCallbacks 클래스를 생성하면 Unity는 App Thread라는 새 스레드를 생성합니다.애플리케이션이 5초 후에 응답하지 않으면 Windows App Certification Kit 테스트를 통과하지 못한다는 Microsoft의 제한 사항으로 인해 Unity는 이 새 스레드를 생성합니다.자세한 내용은 Windows App Certification Kit에 대한 Microsoft의 문서를 참조하십시오.

참고:InvokeOnAppThread 함수에서 호출되지 않는 한 App.xaml.cppMainPage.xaml.cpp 파일에 있는 코드는 항상 UI 스레드에서 실행됩니다.

커맨드 라인 인자

커스텀 커맨드 라인 인자를 문자열 배열로 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); DirectX 11의 렌더 타겟으로 사용되는 XAML 컨트롤을 Unity에 전달합니다.
void GetSwapChainPanel() SetSwapChainPanel 메서드를 통해 설정할 수 있는 SwapChainPanel 오브젝트를 반환합니다.
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 이벤트를 구독하고 그래픽스를 제외한 모든 엔진 보조 시스템과 IL2CPP 스크립팅 백엔드를 로드합니다.
bool UnityGetInput() Unity가 수신하는 입력을 처리하는 경우 true를 반환합니다.
void UnitySetInput(bool enabled) 입력 처리를 활성화하거나 비활성화합니다.
bool UnityPause(int pause) 1을 전달하면 Unity를 일시정지하고 0을 전달하면 일시정지를 해제합니다.이 함수는 게임을 일시적으로 정지하고 싶은 경우 유용합니다.

추가 리소스

UWP용 C# 스크립트의 WinRT API
UWP의 커맨드 라인 인자