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

  • 0
    いいね
  • 0
    コメント

    はじめに

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

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

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

    以上