はじめに
この記事はTerrariaでのMod開発を行うに辺り、既存のデータを流用するために、リフレクションを使用してTexture2Dオブジェクトを抜き出す方法です。
※これを書き始めてから、あれ?そもそも、xnbとかいうファイルがあるから、これから抜き出せるのでは?っと思ったら、当然、そういったツールがあるようですね。直ぐに次のような記事が見つかりました。
MOD - Stardew Valley 日本語Wiki
Terrariaのグラフィックを差し替える | Frea.Inventory
まぁ、今回のケースでは、実際のフィールド名でファイルを出力するので、イメージを確認してどのフィールドから取得すれば良いかがわかるようになります。
コード
using Microsoft.Xna.Framework.Graphics;
using Terraria;
:
Main.instance.GetType().GetFields().ToList().ForEach(x => {
try
{
if (x.FieldType.Equals(typeof(Texture2D)))
{
SaveAsPng($@"c:\{x.Name}.png", (Texture2D)x.GetValue(Main.instance));
}
else if (x.FieldType.Equals(typeof(Texture2D[])))
{
Texture2D[] textures = (Texture2D[])x.GetValue(Main.instance);
for (int i = 0; i < textures.Length; i++)
SaveAsPng($@"c:\{x.Name}_{i}.png", textures[i]);
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine($"{x.Name} {e.Message}");
}
});
SaveAsPng
は前回、イメージ処理について記事にしましたが、その際に作っておいたメソッドで、パスとイメージデータを受け取って、ファイル出力するだけの処理です。
なお、これはTerrariaを起動して出力しているのですが、一部のテクスチャは、特定のメソッドを呼び出してロードするなどしないと取り込めないので、そういったケースは個別に対処が必要です。
とりあえず、備忘録としてないので、話題としている部分のコードのみ抜き出しているだけです。
タブンその内、整理します・・・
以上