JPEG / PNGを受け入れ、Texture2Dコンテンツを含むXNBファイルを出力するXNAゲーム用のゲームエディターを作成しています。
私は自分のカスタムなどのカスタムシリアライザーを持っており、Reflectionなどを使用してContentCompilerを呼び出すことにすべてを掘り下げて、実際の汚い部分に取り掛かり、実際にその部分を自分のフォーマットで機能させることができます。ただし、XNAがコンパイル(プロジェクトのビルド時にVisual Studioで)およびロード(最もよく使用されるContent.Loadメソッドを使用するゲームで)する方法を知っている通常のTexture2D形式にシリアル化する必要があります。自分のイメージを作成したくありません。このためのファイル形式は明らかです。Texture2Dをコンパイルしようとすると、エラーは発生せず、XNBファイルが作成されますが、ファイルの内容は画像データではなく、わずか3〜4 KBのオーバーヘッドです(これは私がTexture2Dオブジェクトの他の非イメージプロパティだと思います)。
コンパイルに使用するコードは次のとおりです。
protected void InitializeWriter()
{
Type compilerType = typeof(ContentCompiler);
cc = compilerType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0].Invoke(null) as ContentCompiler;
compileMethod = compilerType.GetMethod("Compile", BindingFlags.NonPublic | BindingFlags.Instance);
}
internal void Write(string objectName, string path, object objectToWrite)
{
if (basePath == null)
{
throw new InvalidOperationException("The base path to write has not been set.");
}
if (cc == null) { InitializeWriter(); }
string fullPath = Path.Combine(basePath, path, objectName + ".xnb");
using (FileStream fs = File.Create(fullPath))
{
compileMethod.Invoke(cc, new object[]{
fs, objectToWrite, TargetPlatform.Windows, GraphicsProfile.Reach, false/*true*/, fullPath, fullPath
});
}
}
私は自分のコンテンツプロセッサを持っており、このコードはそれらと完璧に連携します。これは、ContentCompilerのCompileメソッドを呼び出すだけですが、Reflectionを使用します(内部クラスであるため)。
Texture2Dがシリアル化される理由はわかりませんが、実際のビットマップデータはありません。
編集 申し訳ありませんが、Texture2Dをコンパイルしません(GraphicsDeviceの循環参照について文句を言います)。Bitmapオブジェクトをコンパイルしようとすると、エラーなしでコンパイルされますが、実際のビットマップデータはシリアル化されません)