これはアプリケーションと Unity エンジンの橋渡しをするために呼び出します。ここでは、AppCallbacks どんなことでできるかを解説します。まずはビルドでして .NET Scripting Backend で作成された 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 がネイティブからマネージドコードを呼び出す (native-to-managed) ために内部で使用します。マネージドからネイティブを呼び出す操作は開発者の利用を想定されていません。WinRT プラットフォームの制限のために Unity エンジンのコードからは生成されないため、WinRTBridge がここに生成され Unity エンジンへ appCallbacks.SetBridge(_bridge) を通して代わりに引き渡されます。
appCallbacks = new AppCallbacks(false);
AppCallbacks クラスに注目してみましょう。生成時にはゲームを別のスレッド上で動作するよう指定します。これは互換性のためであり UI スレッドでアプリケーションを動作させることも可能ですがおすすめできません。これは Microsoft からの制限 - アプリケーションは 5 秒以内に応答できなければ認証 WACK (Windows Application Certification) をパスできないためです。詳しくはここを参照 https://msdn.microsoft.com/ja-jp/library/windows/apps/hh184840.aspx、最初のゲームステージが大きくなってしまった場合を想像してみてください。アプリケーションが UI スレッドで実行されているとロードには長時間を要するようになり UI はロードが完全に終わるまで応答不能となるでしょう。これがゲームを別スレッド上で実行するることをおすすめする理由です。
UI スレッド上の動作に関してはこちらも参照してください - http://msdn.microsoft.com/ja-jp/library/windows/apps/hh994635.aspx
備考: App.xaml.cs や MainPage.xaml.cs のコードは常に UI スレッドで動作し、InvokeOnAppThread 関数から呼ぶ必要はありません。
appCallbacks.SetSwapChainBackgroundPanel(mainPage.GetSwapChainBackgroundPanel());
このシンプルな XAML コントロールから Unity へのパスは DirectX 11 での対象の描画に使用されます。
appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow);
Unity に CoreWindow をセットすると Unity は次のイベントを扱えるようになります (この情報は最新のものではさらに増えている可能性があります) :
appCallbacks.InitializeD3DXAML();
これは Unity のためのメイン初期化関数で、次のことを行います。
このとき Unity が最初のゲームステージのロードを完了した時点で、メインループを開始します。
デリゲートの実行をアプリケーションスレッドへ依頼します。スクリプトの実行を UI スレッドからの呼び出しを待って行いたい場合に使用します。
デリゲートの実行を UI スレッドへ依頼します。何かしらの XAML 固有 API をスクリプトから実行依頼したい場合に使用します。
アプリケーションスレッドで実行されている場合は true を返します。
UI スレッドで実行されている場合は true を返します。
D3D アプリケーションを初期化する関数です。
D3D アプリケーションのメインループを開始するための関数です。
最初のゲームステージが完全にロードされていると true を返します。
アプリケーションのためにコマンドライン引数をセットします。InitializeD3DWindow()、InitializeD3DXAML() の前に呼ばれる必要があります。
Unity API から後ほどアクセスするためのアプリケーション引数を設定します - UnityEngine.WSA.Application.arguments
この関数は、非推奨で動作しません。Unity の旧バージョンでは、UnityRenderEvent などではコールバックのネイティブプラグインを登録する必要がありました。現在は、すべてのプラグインが自動的に登録されます。この関数は今後のアップデートで削除されます。
コマンドライン引数をファイルから解析します。引数はスペースで区切られている必要があります。
1 を渡すと Unity を一時停止し、0 を渡すと解除します。ゲームを一時的に停止させたい場合に使用します。例えばゲームのキャプチャを撮った場合などです。
入力の可否を切り替えます。
Unity が入ってくる入力を処理できる場合 ture を返します。
スクリーンキーボードのトリガに使うコントロールをセットします。このコントロールはスクリプトからスクリーンキーボードが要求されるとシンプルなフォーカスを受けとります。コントロールが呼ばれるとフォーカスされたキーボードをオープンします。
キーボード入力のトリガとして使っているコントロールを返します。SetKeyboardTriggerControl を参照してください。
CoreWindow と独立した入力ソース (使用している場合) の両方にシステムカーソルをセットします。
CoreWindow と独立した入力ソース (使用している場合) の両方にカスタムのカーソルをセットします。パラメータにはカーソルのリソース ID を指定します。