質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

6340閲覧

【Unity】Unity上でのテクスチャファイルサイズを取得したい

Y0241-N

総合スコア1066

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/03/11 06:37

編集2020/03/11 06:38

実現したいこと

UnityでテクスチャのMaxSizeを変更すると、Inspectorの下側にUnity上でのテクスチャファイルサイズが表示されますが、これをスクリプトで取得できないかなと思っています。
イメージ説明

試したこと

cs

1 Texture ThisTex = Objects[0].GetComponent<Renderer>().material.mainTexture; 2 string TexPath = AssetDatabase.GetAssetPath(ThisTex); 3 FileInfo fileInfo = new FileInfo(TexPath); 4 Debug.Log(fileInfo.Length);

こんな感じで取得できないかな~と試してみましたが、出てきた数字はテクスチャの元々のファイルサイズでした。
もし取得できないのであれば諦めます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あそこの文字列はEditor.GetInfoStringをオーバーライドして表示しているようです。実装を見てみますと、たとえばTextureInspectorの場合はTextureUtilクラスのGetStorageMemorySizeLongRenderTextureEditorの場合はGetRuntimeMemorySizeLongを使ってサイズを取得しているようでした。
残念ながらTextureUtilinternalクラスのようですので、これらを使うとしたら下記のようなヘルパークラスを作って無理やりアクセスすることになると思います。

C#

1using System; 2using System.Linq; 3using System.Reflection; 4using UnityEditor; 5using UnityEngine; 6 7public static class TextureUtility 8{ 9 private static Type textureUtilType; 10 private static MethodInfo getStorageMemorySizeLongInfo; 11 private static MethodInfo getRuntimeMemorySizeLongInfo; 12 private static readonly Texture[] TextureArgument = new Texture[1]; 13 14 private static Type TextureUtilType 15 { 16 get 17 { 18 // TextureUtilクラスを探す 19 if (textureUtilType == null) 20 { 21 textureUtilType = typeof(EditorApplication).Assembly.GetTypes().FirstOrDefault(t => t.FullName == "UnityEditor.TextureUtil"); 22 if (textureUtilType == null) 23 { 24 throw new Exception("TextureUtil not found."); 25 } 26 } 27 28 return textureUtilType; 29 } 30 } 31 32 private static MethodInfo GetStorageMemorySizeLongInfo 33 { 34 get 35 { 36 // GetStorageMemorySizeLongを探す 37 if (getStorageMemorySizeLongInfo == null) 38 { 39 getStorageMemorySizeLongInfo = TextureUtilType.GetMethod("GetStorageMemorySizeLong"); 40 if (getStorageMemorySizeLongInfo == null) 41 { 42 throw new Exception("GetStorageMemorySizeLong not found."); 43 } 44 } 45 46 return getStorageMemorySizeLongInfo; 47 } 48 } 49 50 private static MethodInfo GetRuntimeMemorySizeLongInfo 51 { 52 get 53 { 54 // GetRuntimeMemorySizeLongを探す 55 if (getRuntimeMemorySizeLongInfo == null) 56 { 57 getRuntimeMemorySizeLongInfo = TextureUtilType.GetMethod("GetRuntimeMemorySizeLong"); 58 if (getRuntimeMemorySizeLongInfo == null) 59 { 60 throw new Exception("GetRuntimeMemorySizeLong not found."); 61 } 62 } 63 64 return getRuntimeMemorySizeLongInfo; 65 } 66 } 67 68 // テクスチャデータのバイト数を得る(メインメモリ側に保持されているデータのサイズ?) 69 public static long GetStorageMemorySizeLong(Texture texture) 70 { 71 TextureArgument[0] = texture; 72 return (long)GetStorageMemorySizeLongInfo.Invoke(null, TextureArgument); 73 } 74 75 // テクスチャデータのバイト数を得る(グラフィックメモリ側に保持されているデータのサイズ?) 76 public static long GetRuntimeMemorySizeLong(Texture texture) 77 { 78 TextureArgument[0] = texture; 79 return (long)GetRuntimeMemorySizeLongInfo.Invoke(null, TextureArgument); 80 } 81}

他にもProfiler.GetRuntimeMemorySizeLongなんてものもあるようで、こちらはUnityユーザー側も使えるように公開されているみたいですね。リファレンスのサンプルコードに、まさにこれを使ってテクスチャのサイズを調べる例が載っていました。

Texture2DRenderTextureを使っていくつか試してみたところ、Profiler.GetRuntimeMemorySizeLongの値とTextureUtil.GetRuntimeMemorySizeLongの値はいつも一致しているように思われました。RenderTextureについてはProfiler.GetRuntimeMemorySizeLongを使えばよさそうです。

Texture2Dの場合、たまにTextureUtil.GetStorageMemorySizeLongTextureUtil.GetRuntimeMemorySizeLongの値が異なるケースがあるようです。詳しく調べておりませんので不確かですが、幅か高さが極端に小さい(4ピクセル未満?)とか、圧縮フォーマットであるとか、サイズが2の冪乗でないとかが関係しているような気もします。
インスペクターに表示されるのはTextureUtil.GetStorageMemorySizeLongの方で、Profiler.GetRuntimeMemorySizeLongで取得されるのはTextureUtil.GetRuntimeMemorySizeLongの方みたいですから、Texture2Dに関してはTextureUtil.GetStorageMemorySizeLongを使った方がつじつまの合った値が得られそうです。

他にも、Texture2DならGetRawTextureDataでテクスチャデータを取ってきて、それのバイト数を調べるという手が使えるかもしれません。

C#

1 public static long GetRawDataSize(Texture2D texture) 2 { 3 return texture.GetRawTextureData().LongLength; 4 }

いくつか試したかぎりではTextureUtil.GetStorageMemorySizeLongの方の値と一致しているようでした。サイズを調べるためだけにテクスチャデータ全体を取得するというのはちょっと大げさな気がしますが、TextureUtilに頼らずやりたいなら仕方ないかもしれませんね。

投稿2020/03/12 10:00

編集2020/03/12 10:21
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2020/03/12 23:47

詳細かつ丁寧な解説付きの回答ありがとうございます。 すごい知識量ですね..、なるほど、一応は取得方法はあるんですね。 実際にTextureUtil.GetStorageMemorySizeLongを使って取得してみようと思います、回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問