LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-07

はじめに

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

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

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

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0