ホーム
おまかせ表示
ログイン
設定
MonoBookについて
免責事項
MonoBook
検索
「
MonoGameで外部のXNBファイルを読み込む
」を編集中
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
[[MonoGame]]で作っている[[ゲーム]]に起動時データ更新を実装し、[[プログラム]]以外の画像や音楽などだけであれば自動更新するようにしたいわけだ。[[スマホ]]の[[ゲーム]]によくあるアレである。むしろ[[プログラム]]の細かい部分も[[NeoLua]]に投げるようにしてしまいたい。 そうなると外部から各種[[データ]]を読み込む必要が出てくる。しかし[[MonoGame]]で扱う各種[[データ]]の基本は[[プログラム]]に組み込まれた「Content」である。 == Xamarin.Android == [[MonoGame]]の[[ソースコード]]をざっと見た感じ、[[Xamarin.Android]]ではContentManagerクラスでアセット以外の[[ファイル]]へはアクセスできないようだ。ContentManagerクラスの[[ソースコード]]をみると幸いにもvirtualやらがチラホラ見受けられ継承してoverrideする前提の構造になっている。なので細かいことは考えずにoverrideしてしまえと考えた。 ついでに各種パラメータを保存した[[csv]]や[[json]]などのxnb以外の[[ファイル]]も同様の手順で読み込めるように、xnbパーサを経由しない裏口も用意すると捗った。 <source lang="csharp"> using System; using System.IO; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; public class ExternalContentManager : Microsoft.Xna.Framework.Content.ContentManager { public ExternalContentManager(IServiceProvider serviceProvider, string rootDirectory) : base(serviceProvider, rootDirectory) { } public ExternalContentManager(IServiceProvider serviceProvider) : base(serviceProvider) { } protected override Stream OpenStream(string assetName) { string assetPath; if (Path.GetExtension(assetName) != "xnb") { assetPath = assetName + ".xnb"; } else { assetPath = assetName; } return OpenRead(assetPath); } public Stream OpenRead(string fileName) { Stream stream = null; string path; try { if (Path.IsPathRooted(fileName)) { path = fileName; } else { path = Path.Combine(RootDirectory, fileName); } stream = File.OpenRead(path); // Read the asset into memory in one go. This results in a ~50% reduction // in load times on Android due to slow Android asset streams. var memStream = new MemoryStream(); stream.CopyTo(memStream); memStream.Seek(0, SeekOrigin.Begin); stream.Close(); stream = memStream; } catch (FileNotFoundException fileNotFound) { throw new ContentLoadException("The content file was not found.", fileNotFound); } catch (DirectoryNotFoundException directoryNotFound) { throw new ContentLoadException("The directory was not found.", directoryNotFound); } catch (Exception exception) { throw new ContentLoadException("Opening stream error.", exception); } return stream; } } </source> 使い方は普通のContentManagerと大して変わらない。 <source lang="csharp"> // Androidであれば「/data/data/アプリID/files」あたりが返ってくるはず。 var rootdir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); var cm = new ExternalContentManager(this.Content.ServiceProvider, rootdir); var font = cm.Load<SpriteFont>("IPA-Gothic"); </source> == 関連項目 == * [[MacOS版のMonoGameのPipeline.appで3Dモデルをビルドできない]] * [[MonoGameで使う3DモデルをFusion360で作成する]] * [[MonoGameのカメラを作る]] [[category:MonoGame]] [[category:Xamarin.Android]]
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)