0

XNAゲーム用のコンテンツエディターを作成していて、コンテンツリーダーとライターの準備ができています。私のエディターでは、フォルダー内のすべてのファイルを繰り返し処理して、エディターウィンドウにオブジェクトのリストを表示します。設定は完了しましたが、コンテンツフォルダのファイルリストを取得した後の作業に固執しています。

すべてのファイルにはXNB拡張子が付いており、それらを読み取る唯一の(ハッキーではない)方法は、XNAコンテンツリーダーを使用することです。ただし、ファイルを1つずつロードしてそれぞれをロードしようとせずに、ファイルのコンテンツタイプ(マップ、ゲームオブジェクトテンプレート、または私が定義した他の多くのタイプのファイル)を事前に知りたいです。可能なコンテンツタイプのそれぞれで、それは事実上不可能です(または、たとえば、これまでで最悪のプログラミング慣行)。

この機能のようなものを取得するにはどうすればよいですか?

ContentManager.ContentTypeOf(string assetPath);これは型を返すので、何をどこにロードするか(ロードしないか)を事前に知ることができます。単一のオブジェクトテンプレートを編集するためだけにゲームのすべてのマップをロードすることはお勧めできません。コンテンツファイルの種類を区別するための実用的な方法が必要です。

4

4 に答える 4

1

xnbにアクセスして、コンテンツリーダー名を取得できます。

これがxnb形式の仕様ファイルです

于 2011-11-13T20:43:06.210 に答える
1

少し遅れるかもしれませんが、私は同じ問題を抱えていました。

自分のコンテンツプロセッサを使用して、出力ディレクトリ「[modelfilename].model」に空のファイルを追加しました。そして、私のコードですべての* .modelファイルを列挙し、拡張子なしのファイル名だけでモデルをロードします。必要に応じて、そのファイルにさらに多くの情報を簡単に入れることもできます。

カスタムコンテンツプロセッサのコード:

 string Name = Path.GetFileNameWithoutExtension(context.OutputFilename);
 FileStream fs = File.Create(Path.GetDirectoryName(context.OutputFilename) + @"\" + Name + @".model");
 fs.Close();
于 2011-12-16T14:06:58.757 に答える
0

これは非常に簡単です。タイプとしてロードするだけですObject

Type type = content.Load<Object>("MyContent").GetType();

唯一の欠点は、アセット全体をロードしてそのタイプを把握する必要があることです。

この方法でロードされたコンテンツに異なるライフタイムポリシーを実装するには、別のインスタンスを使用するか、保護されたメソッドContentManagerから独自のクラスを派生させて調べることを検討してください。ContentManagerReadAsset

于 2011-11-14T12:01:51.280 に答える
0

さて、実際にファイルを読んでも簡単な解決策が見つからなかったので、ファイルをフォルダー階層に整理することにしました。これで、どのファイルが何であるかがわかりました。それは少なくとも仕事をします。最も実行可能な解決策ではないかもしれませんが、それは機能します。

于 2011-11-29T00:21:24.760 に答える