実現したいこと
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
あそこの文字列はEditor.GetInfoStringをオーバーライドして表示しているようです。実装を見てみますと、たとえばTextureInspectorの場合はTextureUtilクラスのGetStorageMemorySizeLong
、RenderTextureEditorの場合はGetRuntimeMemorySizeLong
を使ってサイズを取得しているようでした。
残念ながらTextureUtil
はinternal
クラスのようですので、これらを使うとしたら下記のようなヘルパークラスを作って無理やりアクセスすることになると思います。
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ユーザー側も使えるように公開されているみたいですね。リファレンスのサンプルコードに、まさにこれを使ってテクスチャのサイズを調べる例が載っていました。
Texture2D
やRenderTexture
を使っていくつか試してみたところ、Profiler.GetRuntimeMemorySizeLong
の値とTextureUtil.GetRuntimeMemorySizeLong
の値はいつも一致しているように思われました。RenderTexture
についてはProfiler.GetRuntimeMemorySizeLong
を使えばよさそうです。
Texture2D
の場合、たまにTextureUtil.GetStorageMemorySizeLong
とTextureUtil.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総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/12 23:47