Xamarin.AndroidのViewとMonoGameを混在させる
2021年12月29日 (水) 04:23時点におけるAdministrator (トーク | 投稿記録)による版
MonoGameはものすごく低レベルなAPI群なので、Xamarin.Androidの各種View(各種UI)を混在させたいことも多い。
たとえばMonoGameには「文字入力」などという軟弱な概念はないので日本語入力対応のテキストボックスを使いたい場合や、Google AdMobでバナー広告を表示したい場合などが考えられる。
なお、以下の方法はiOSなどのマルチプラットフォーム対応などクソくらえである。ググると「Xamarin.FormsとMonoGameで同様のことをやりたい」という事例がstackoverflow.comなどで散見されたが、その解決策は「MonoGame使うのやめてCocosSharpを使え」というものであった。CocosSharpを軽く触ってみたが、物理演算のために固定フレームレートにしたいが設定方法がわからない、3Dモデルの描画方法がわからないなど、わからないことだらけで撃沈した。
実装例
新規プロジェクトを作った直後に自動生成されるソースコードはこんな感じ。アクティビティにいきないMonoGameのViewを追加している。つまりMonoGameの描画領域も普通のAndroid.View.Viewから派生したものだ。
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
var g = new Game1();
SetContentView((View)g.Services.GetService(typeof(View)));
g.Run();
}
ならば普通に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();
}
まじかよ。うごいた。