ページ「カテゴリ:MonoGame」と「MonoGameで外部のXNBファイルを読み込む」の間の差分
(ページ間の差分)
ナビゲーションに移動
検索に移動
(→概要) |
|||
1行目: | 1行目: | ||
− | + | [[MonoGame]]で作っている[[ゲーム]]に起動時データ更新を実装し、[[プログラム]]以外の画像や音楽などだけであれば自動更新するようにしたいわけだ。 | |
+ | むしろ[[プログラム]]の細かい部分も[[NLua]]に投げるようにしてしまいたい。 | ||
− | + | そうなると外部から各種[[データ]]を読み込む必要が出てくる。 | |
− | + | しかしMonoGameで扱う各種データの基本はプログラムに組み込まれた「Content」である。 | |
− | + | ==Xamarin.Android== | |
+ | [[MonoGame]]のContentManagerクラスの[[ソースコード]]をざっと見た感じ、[[Xamarin.Android]]ではアセット以外の[[ファイル]]へはアクセスできないようだ。 | ||
+ | ContentManagerクラスの[[ソースコード]]をみると幸いにもvirtualやらがチラホラ見受けられ継承してoverrideする前提の構造になっている。 | ||
+ | なので細かいことは考えずにoverrideしてしまえ。 | ||
− | + | ついでに各種パラメータを保存した[[csv]]や[[json]]などのxnb以外の[[ファイル]]も同様の手順で読み込めるように、xnbパーサを経由しない裏口も用意すると捗った。 | |
+ | 個人的な主な用途としては、[[OpenGL ES]]の[[バーテックスシェーダー]]は書き込みだけで読み出せないため、[[モデル]]とは別に頂点データのcsvファイルを読み込み、それを当たり判定に用いている。 | ||
− | + | <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); | ||
+ | } | ||
− | + | // This is primarily for editor support. | |
+ | // Setting the RootDirectory to an absolute path is useful in editor | ||
+ | // situations, but TitleContainer can ONLY be passed relative paths. | ||
+ | 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> | |
+ | // Androidであれば「/data/data/アプリID/files」あたりが返ってくるはず。 | ||
+ | var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); | ||
+ | var cm = new ExternalContentManager(this.Content.ServiceProvider, path); | ||
+ | var font = cm.Load<SpriteFont>("IPA-Gothic"); | ||
+ | </source> | ||
− | * | + | ==関連項目== |
+ | *[[MonoGame]] | ||
− | + | [[category:MonoGame]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[category:Xamarin.Android]] | [[category:Xamarin.Android]] |
2016年1月14日 (木) 05:45時点における版
MonoGameで作っているゲームに起動時データ更新を実装し、プログラム以外の画像や音楽などだけであれば自動更新するようにしたいわけだ。 むしろプログラムの細かい部分もNLuaに投げるようにしてしまいたい。
そうなると外部から各種データを読み込む必要が出てくる。 しかしMonoGameで扱う各種データの基本はプログラムに組み込まれた「Content」である。
Xamarin.Android
MonoGameのContentManagerクラスのソースコードをざっと見た感じ、Xamarin.Androidではアセット以外のファイルへはアクセスできないようだ。 ContentManagerクラスのソースコードをみると幸いにもvirtualやらがチラホラ見受けられ継承してoverrideする前提の構造になっている。 なので細かいことは考えずにoverrideしてしまえ。
ついでに各種パラメータを保存したcsvやjsonなどのxnb以外のファイルも同様の手順で読み込めるように、xnbパーサを経由しない裏口も用意すると捗った。 個人的な主な用途としては、OpenGL ESのバーテックスシェーダーは書き込みだけで読み出せないため、モデルとは別に頂点データのcsvファイルを読み込み、それを当たり判定に用いている。
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);
}
// This is primarily for editor support.
// Setting the RootDirectory to an absolute path is useful in editor
// situations, but TitleContainer can ONLY be passed relative paths.
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;
}
}
使い方は普通のContentManagerと大して変わらない。
// Androidであれば「/data/data/アプリID/files」あたりが返ってくるはず。
var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
var cm = new ExternalContentManager(this.Content.ServiceProvider, path);
var font = cm.Load<SpriteFont>("IPA-Gothic");
関連項目
カテゴリ「MonoGame」にあるページ
このカテゴリには 54 ページが含まれており、そのうち以下の 54 ページを表示しています。
M
- MacOS版のMonoGameのPipeline.appで3Dモデルをビルドできない
- MonoGame (Xamarin.Android)で初期解像度がおかしい機種の対策
- MonoGame (Xamarin.Android)で画面の向きを指定する
- MonoGame 3.7.1以前でfxファイルをコンパイルする
- MonoGame 3.8.0以降でfxファイルをコンパイルする
- MonoGame(Android)でコンテンツを利用する
- MonoGame(Xamarin.Android)にAdMobのバナー広告を表示させる
- MonoGame/MonoMacおよびXamarin.Macで起動時にクラッシュする
- MonoGame/クラスライブラリ
- MonoGame/クラスライブラリ/BasicEffectクラス
- MonoGame/クラスライブラリ/DirectionalLightクラス
- MonoGame/クラスライブラリ/Gameクラス
- MonoGame/クラスライブラリ/GraphicsProfile列挙体
- MonoGame/クラスライブラリ/IndexBufferクラス
- MonoGame/クラスライブラリ/IndexElementSize列挙体
- MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Audio名前空間
- MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Content名前空間
- MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間
- MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Input.Touch名前空間
- MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Input名前空間
- MonoGame/クラスライブラリ/Microsoft.Xna.Framework名前空間
- MonoGame/クラスライブラリ/Mouseクラス
- MonoGame/クラスライブラリ/RenderTarget2Dクラス
- MonoGame/クラスライブラリ/RenderTargetUsage列挙体
- MonoGame/クラスライブラリ/SurfaceFormat列挙体
- MonoGame/クラスライブラリ/VertexBufferクラス
- MonoGame/クラスライブラリ/VertexPositionColorTexture構造体
- MonoGame/クラスライブラリ/VertexPositionColor構造体
- MonoGameでBGMを再生する
- MonoGameでHLSLにMatrixを渡す
- MonoGameでSkiaSharpを使う
- MonoGameで「コンテンツ」を追加する
- MonoGameでハードウェアインスタンシングしてみる
- MonoGameでピクセルシェーダーを使ってテクスチャを貼る
- MonoGameでマウスを使用する
- MonoGameでマウスカーソルを表示する
- MonoGameでマウス位置を3D平面に投影する
- MonoGameで位置と色と法線とUV座標を持つカスタム頂点を使いたい
- MonoGameで使う3DモデルをFusion360で作成する
- MonoGameで外部のXNBファイルを読み込む
- MonoGameで画面空間からモデル空間に投影する
- MonoGameで直線を描画する
- MonoGameで解像度を取得する
- MonoGameで解像度を設定する
- MonoGameで遅延レンダリングをする
- MonoGameの3Dモデルを管理描画するクラスを作る
- MonoGameのカメラを作る