Platform Windows Universal: Peluncuran Asosiasi
Platform Windows Universal: WinRT API dalam skrip C#

Kelas AppCallbacks

Anda dapat memanggil kelas AppCallbacks jembatan antara aplikasi utama Anda dan mesin Unity. Di sini, kami akan mencoba untuk menjelaskan apa setiap panggilan ke AppCallbacks persis. Mari kita membangun solusi dan menjelajahi App.xaml.cpp dan MainPage.xaml.cpp file.

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();

Mari kita lihat lebih dekat kelas AppCallbacks. Ketika Anda membuatnya, Unity menciptakan benang baru yang disebut “AppThread”. Hal ini dilakukan karena ada pembatasan dari Microsoft - jika aplikasi Anda tidak menjadi responsif setelah 5 detik Anda akan gagal untuk lulus WACK (Windows Application Certification). (Anda dapat membaca lebih lanjut di sini - http://msdn.microsoft.com/en-us/library/windowsphone/develop/h184840(v=vs.105).aspx) Bayangkan jika tingkat pertama Anda cukup besar dan membutuhkan waktu yang signifikan untuk memuat. Karena aplikasi Anda berjalan pada benang UI(User Interface) Memungkinkan pengguna untuk berinteraksi dengan aplikasi Anda. Unity saat ini mendukung tiga sistem UI. More info
Lihat di Glossary
, UI akan tidak responsif sampai tingkat Anda dimuat sepenuhnya. Itu sebabnya Unity selalu menjalankan permainan Anda pada benang yang berbeda.

Baca lebih lanjut pada benang UI di sini - http://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx

Anda juga dapat melewati argumen baris perintah kustom sebagai array string ke dalam konstruktor AppCallbacks.

Sitemap Kode yang terletak di App.xaml.cpp, MainPage.xaml.c [[ selalu berjalan pada benang UI, kecuali disebut dari fungsi InvokeOnAppThread.Note: Code located in App.xaml.cpp, MainPage.xaml.c[[ is always running on UI thread, unless called from InvokeOnAppThread function.

appCallbacks->SetSwapChainPanel(m_DXSwapChainPanel);

Ini hanya melewati kontrol XAML ke Unity yang akan digunakan sebagai target render untuk DirectX 11.

appCallbacks->SetCoreWindowEvents(Window::Current->CoreWindow);

Mengatur jendela inti untuk Unity, Pelanggan Unity ke acara berikut (mereka mungkin lebih, tergantung pada ketika informasi ini diperbarui):

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

appCallbacks->InitializeD3DXAML();

Ini adalah fungsi awalisasi utama untuk Unity, hal-hal berikut:

  • Memperas perangkat DirectX 11
  • Beban tingkat pertama

Pada titik ini, ketika selesai Unity memuat tingkat pertama, itu memasuki loop utama.

Fungsi lain

  • void InvokeOnAppThread(AppCallbackItem item, bool waitUntilDone)

Menggabungkan delegasi pada benang aplikasi, yang berguna ketika Anda ingin mengeksekusi fungsi skrip Anda dari benang UI.

  • void InvokeOnUIThread(AppCallbackItem item, bool waitUntilDone)

Menjelajahi delegasi pada benang UI, berguna ketika Anda ingin membatalkan sesuatu API spesifik XAML dari scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary
Anda.

  • bool RunningOnAppThread()

Kembali benar, jika Anda saat ini berjalan di benang aplikasi.

  • bool RunningOnUIThread()

Kembali benar, jika Anda saat ini berjalan di benang UI.

  • void InitializeD3DWindow()

Fungsi awalisasi untuk aplikasi D3D.

  • void Run()

Fungsi yang digunakan oleh aplikasi D3D, untuk memasuki loop utama.

  • bool IsInitialized()

Kembali benar, ketika tingkat pertama penuh dimuat.

  • void AddCommandLineArg(string arg)

Mengatur argumen baris perintah untuk aplikasi, harus disebut sebelum InitializeD3DWindow, InitializeD3DXAML.

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

Mengatur argumen aplikasi, yang kemudian dapat diakses dari Unity API - UnityEngine.WSA.Application.arguments.

  • void LoadGfxNativePlugin(string pluginFileName)

Fungsi ini usang dan tidak ada. Dalam versi sebelumnya Unity, ini diperlukan untuk mendaftarkan plugin asli untuk callback seperti UnityRenderEvent. Semua plugin sekarang terdaftar secara otomatis. Fungsi ini akan dihapus dalam pembaruan masa depan.

  • void ParseCommandLineArgsFromFiles(string fileName)

Mengatur argumen baris perintah dari file, argumen harus dipisahkan oleh ruang putih.

  • bool UnityPause(int pause)

Jeda Unity jika Anda lulus 1, tidak digunakan jika Anda melewati 0, berguna jika Anda ingin membekukan permainan Anda sementara, untuk ex., ketika permainan Anda terkunci.

  • void UnitySetInput(bool enabled)

Aktifkan / menonaktifkan input.

  • bool UnityGetInput()

Kembali benar, jika Unity akan memproses input masuk.

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

Mengatur kontrol untuk digunakan untuk memicu keyboard layar. Kontrol ini hanya akan menerima fokus, ketika di keyboard layar diminta dalam skrip. Harus disebut dengan kontrol, yang tidak terbuka keyboard pada fokus.

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

Kontrol pengembalian, saat ini digunakan kontrol untuk memicu input keyboard. Lihat SetKeyboardTriggerControl.

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

Mengatur kursor sistem. Kurosr yang diberikan diatur untuk sumber input intiWindow dan independen (jika digunakan).

  • void SetCustomCursor(unsigned int id)

Mengatur kursor sistem untuk kustom. Parameter adalah ID sumber daya kursor. Cursor diatur untuk sumber input CoreWindow dan independen (jika digunakan).

Platform Windows Universal: Peluncuran Asosiasi
Platform Windows Universal: WinRT API dalam skrip C#