C#
備忘録
XNA
リフレクション
Terraria

【Terraria】リフレクションにてゲーム内のオブジェクトを抜き出す

はじめに

この記事は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を起動して出力しているのですが、一部のテクスチャは、特定のメソッドを呼び出してロードするなどしないと取り込めないので、そういったケースは個別に対処が必要です。

とりあえず、備忘録としてないので、話題としている部分のコードのみ抜き出しているだけです。

タブンその内、整理します・・・

以上