Xamarin.AndroidのViewとMonoGameを混在させる

提供: MonoBook
2018年8月30日 (木) 05:21時点におけるimported>Administratorによる版
ナビゲーションに移動 検索に移動

MonoGameはものすごく低レベルなAPI群なので、Xamarin.Androidの各種View(各種UI)を混在させたいことも多い。

たとえばMonoGameには「文字入力」などという軟弱な概念はないので日本語入力対応のテキストボックスを使いたい場合や、Google AdMobバナー広告を表示したい場合などが考えられる。

なお、この方法はiOS対応などのマルチプラットフォーム対応などクソくらえである。ググるXamarin.FormsMonoGameで同様のことをやりたいという事例がstackoverflow.comなどで散見されたが、その解決策は「CocosSharpを使え」というものであった。CocosSharpを軽く触ってみたが、物理演算のために固定フレームレートにしたいが設定方法がわからない、3Dモデルの描画方法がわからないなど、わからないことだらけで撃沈した。

実装例

新規プロジェクトを作った直後に自動生成されるソースコードはこんな感じ。アクティビティにいきないMonoGameのViewを追加している。MonoGameも普通のViewじゃん。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    var g = new Game1();
    SetContentView((View)g.Services.GetService(typeof(View)));
    g.Run();
}

MonoGameもXamarin.AndroidのViewの一種でした。ならば普通にAndroid.Widget.Layoutに噛ませばいいんじゃね。

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    // レイアウトを手動で構築する
    var layout = new FrameLayout( this );
    SetContentView( layout );

    // MonoGameが動くAndroid.Views.Viewを取得する。
    // Game1はMicrosoft.XNA.Framework.Gameクラスの派生クラス。
    var g = new Game1();
    var gameView = g.Services.GetService<View>();
    layout.AddView( gameView );

    // ゲームループ開始
    g.Run();
}

まじかよ。うごいた。