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):
appCallbacks->InitializeD3DXAML();
Ini adalah fungsi awalisasi utama untuk Unity, hal-hal berikut:
Pada titik ini, ketika selesai Unity memuat tingkat pertama, itu memasuki loop utama.
Menggabungkan delegasi pada benang aplikasi, yang berguna ketika Anda ingin mengeksekusi fungsi skrip Anda dari benang UI.
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.
Kembali benar, jika Anda saat ini berjalan di benang aplikasi.
Kembali benar, jika Anda saat ini berjalan di benang UI.
Fungsi awalisasi untuk aplikasi D3D.
Fungsi yang digunakan oleh aplikasi D3D, untuk memasuki loop utama.
Kembali benar, ketika tingkat pertama penuh dimuat.
Mengatur argumen baris perintah untuk aplikasi, harus disebut sebelum InitializeD3DWindow, InitializeD3DXAML.
Mengatur argumen aplikasi, yang kemudian dapat diakses dari Unity API - UnityEngine.WSA.Application.arguments.
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.
Mengatur argumen baris perintah dari file, argumen harus dipisahkan oleh ruang putih.
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.
Aktifkan / menonaktifkan input.
Kembali benar, jika Unity akan memproses input masuk.
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.
Kontrol pengembalian, saat ini digunakan kontrol untuk memicu input keyboard. Lihat SetKeyboardTriggerControl.
Mengatur kursor sistem. Kurosr yang diberikan diatur untuk sumber input intiWindow dan independen (jika digunakan).
Mengatur kursor sistem untuk kustom. Parameter adalah ID sumber daya kursor. Cursor diatur untuk sumber input CoreWindow dan independen (jika digunakan).