Version: 2018.1
유니버설 Windows 플랫폼: 연관 실행
유니버설 Windows 플랫폼: C# 스크립트의 WinRT API

AppCallbacks 클래스

이 클래스는 메인 애플리케이션과 Unity 엔진 사이의 다리 역할을 합니다. 여기서는 AppCallbacks에 대한 호출이 각각 어떤 역할을 하는지 살펴볼 것입니다. 이제 솔루션을 빌드하고 .NET 스크립팅 백엔드를 사용하면 생성되는 App.xaml.cs 파일을 살펴봅시다.

sealed partial class App : Application
{
    private WinRTBridge.WinRTBridge _bridge;
    private AppCallbacks appCallbacks;
    public App()
    {
        this.InitializeComponent();
        appCallbacks = new AppCallbacks(false);
    }

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        Frame rootFrame = Window.Current.Content as Frame;
        if (rootFrame == null)
        {
            var mainPage = new MainPage();
            Window.Current.Content = mainPage;
            Window.Current.Activate();

            _bridge = new WinRTBridge.WinRTBridge();
            appCallbacks.SetBridge(_bridge);

            appCallbacks.SetSwapChainBackgroundPanel(mainPage.GetSwapChainBackgroundPanel());

            appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow);

            appCallbacks.InitializeD3DXAML();
        }

        Window.Current.Activate();
    }
}

private WinRTBridge.WinRTBridge \_bridge;

WinRTBridge는 Unity가 내부로 사용하여 네이티브와 관리 요소 간 작업을 진행하는 클래스이며 개발자용은 아닙니다. 일부 WinRT 플랫폼 제약으로 인해 Unity 엔진 코드에서 이 클래스를 생성할 수는 없습니다. 그로 인해 WinRTBridge가 여기에서 생성된 후 appCallbacks.SetBridge(_bridge)를 통해 Unity 엔진에 전달됩니다.

appCallbacks = new AppCallbacks(false);

이제 AppCallbacks 클래스에 대해 자세히 살펴봅시다. 클래스를 생성하려면 게임이 다른 스레드에서 실행된다고 명시해야 합니다. 하위 호환성을 위해 UI 스레드에서 애플리케이션을 실행하도록 명시할 수도 있지만 좋은 방법은 아닙니다. 그 이유는 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를 참조하십시오.

참조: InvokeOnAppThread 함수에서 호출되지 않는 한 App.xaml.cs, MainPage.xaml.cs에 있는 코드는 항상 UI 스레드에서 실행됩니다.

appCallbacks.SetSwapChainBackgroundPanel(mainPage.GetSwapChainBackgroundPanel());

이 코드는 DirectX 11 렌더 타겟으로 사용될 XAML 컨트롤을 Unity에 전달합니다.

appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow);

Unity의 코어 창을 설정합니다. Unity는 아래의 이벤트에서 정보를 받습니다(리스트에 없는 새로운 이벤트가 있을 수도 있습니다).

  • VisibilityChanged
  • Closed
  • PointerCursor
  • SizeChanged
  • Activated
  • CharacterReceived
  • PointerPressed
  • PointerReleased
  • PointerMoved
  • PointerCaptureLost
  • PointerWheelChanged
  • AcceleratorKeyActivated

appCallbacks.InitializeD3DXAML();

Unity 메인 초기화 함수이며, 아래의 작업을 수행합니다.

  • AppCallbacks.AddCommandLineArg()가 설정한 커맨드 라인 인자를 분석합니다.
  • DirectX 11 장치를 초기화합니다.
  • 첫 레벨을 로드합니다.

이 시점에서 Unity가 첫 레벨 로드를 완료하면 메인 루프에 진입합니다.

기타 함수

  • void InvokeOnAppThread(AppCallbackItem item, bool waitUntilDone)

애플리케이션 스레드 델리게이트를 호출합니다. UI 스레드에서 스크립트 함수를 호출하고 싶은 경우 유용합니다.

  • void InvokeOnUIThread(AppCallbackItem item, bool waitUntilDone)

애플리케이션 스레드 델리게이트를 호출합니다. 스크립트에서 XAML 전용 API를 호출하고 싶은 경우 유용합니다.

  • bool RunningOnAppThread()

현재 애플리케이션 스레드에서 실행 중인 경우 true값을 반환합니다.

  • bool RunningOnUIThread()

현재 UI 스레드에서 실행 중인 경우 true값을 반환합니다.

  • void InitializeD3DWindow()

D3D 애플리케이션 초기화 함수입니다.

  • void Run()

D3D 애플리케이션이 메인 루프에 진입할 때 사용하는 함수입니다.

  • bool IsInitialized()

첫 레벨이 완전히 로드되면 true값을 반환합니다.

  • void AddCommandLineArg(string arg)

애플리케이션의 커맨드 라인 인자를 설정합니다. nitializeD3DWindow, InitializeD3DXAML이전에 호출되어야 합니다.

  • void SetAppArguments(string arg) / string GetAppArguments()

애플리케이션 인자를 설정하며, 나중에 Unity API에서 UnityEngine.WSA.Application.arguments를 통해 접근할 수 있습니다.

  • void LoadGfxNativePlugin(string pluginFileName)

이 함수는 더 이상 사용되지 않으며 실질적인 기능이 없습니다. Unity 이전 버전에서는 UnityRenderEvent와 같이 콜백의 네이티브 플러그인을 등록하는 데 사용되었습니다. 이제 모든 플러그인은 자동으로 등록됩니다. 함수는 추후 업데이트에서 제거될 예정입니다.

  • void ParseCommandLineArgsFromFiles(string fileName)

파일에서 커맨드 라인 인자를 분석하며, 이때 인자는 빈 칸으로 분리되어야 합니다.

  • bool UnityPause(int pause)

1을 전달하면 Unity를 일시정지하며, 0을 전달하면 일시정지를 해제합니다. 게임이 끊긴 경우와 같이 게임을 일시정지하고 싶은 경우 유용합니다.

  • void UnitySetInput(bool enabled)

입력을 활성화하거나 비활성화합니다.

  • bool UnityGetInput()

Unity가 새로운 입력을 처리하는 경우 true값을 반환합니다.

  • void SetKeyboardTriggerControl(Windows.UI.Xaml.Controls.Control ctrl)

화상 키보드를 트리거하는 데 사용되는 컨트롤을 설정합니다. 이 컨트롤은 스크립트에서 화상 키보드를 요청하는 경우 단순 포커스를 받게 됩니다. 포커스가 주어지면 키보드를 여는 컨트롤과 동시에 호출되어야 합니다.

  • Windows.UI.Xaml.Controls.Control GetKeyboardTriggerControl()

현재 키보드 입력을 트리거하는 데 사용되는 컨트롤을 반환합니다. SetKeyboardTriggerControl를 참조하십시오.

  • void SetCursor(Windows.UI.Core.CoreCursor cursor)

시스템 커서를 설정합니다. 설정된 커서는 CoreWindow와 사용되는 경우 독립 입력 소스에 적용됩니다.

  • void SetCustomCursor(unsigned int id)

시스템 커서를 커스텀으로 설정합니다. 여기서 파라미터는 커서 리소스 ID입니다. 설정된 커서는 CoreWindow와 사용되는 경우 독립 입력 소스에 적용됩니다.

유니버설 Windows 플랫폼: 연관 실행
유니버설 Windows 플랫폼: C# 스크립트의 WinRT API