概要
EditorGUIUtilityにはGUILayout.LabelなどGUIContentで表示するアイコンのサイズを変更できるSetIconSizeという関数があります。この関数を呼ぶことで、この場面ではアイコンを小さくしたい、この場面では大きくしたいなど状況に応じて変更を行うことができます。
ただ、デフォルトのサイズに戻したいときに、変更前にGetIconSizeでデフォルトのサイズを取得して変数に保持しておくのは手間に感じました。これを改善できないか調べた所IconSizeScopeを使うことで、上記の問題が解決しそうだということがわかりました。
IconSizeScopeとは
IconSizeScopeとは、GUI.Scopeを継承したScopeです。
GUI.Scopeはusingを使うことでコンストラクタで初期化処理を、using内の処理が終わったあとに呼ばれるIDisposable.Dispose()で解放処理を呼ぶことができるものです。
IconSizeScopeではコンストラクタにVector2を渡すことでアイコンのサイズを設定し、Disposeで変更前のサイズに戻してくれます。
実装
例として32x32の大きさでアイコンを表示し、それ以降はデフォルトのサイズで表示するように実装したいと思います。まずIconSizeScopeを使わなかった場合はこうなります。
//あらかじめデフォルトのサイズを取得
var defaultIconSize = EditorGUIUtility.GetIconSize();
//32x32で表示するように設定
EditorGUIUtility.SetIconSize(new Vector2(32,32));
//アセットの表示に使われているアイコンを持ってきて表示
var texture = AssetDatabase.GetCachedIcon("アセットのパス");
GUILayout.Label(texture);
//デフォルトのサイズに戻す
EditorGUIUtility.SetIconSize(defaultIconSize);
事前にデフォルトのサイズを取得しないといけなかったり、最後に元のサイズに戻さないと行けなかったりと意識しないといけない所がありますね。
ではIconSizeScopeを使うとどうなるかというと、こうなります。
//using内では32x32のサイズで表示するように設定
using(var iconSizeScope = new EditorGUIUtility.IconSizeScope(new Vector2(32,32)))
{
//アセットの表示に使われているアイコンを持ってきて表示
var texture = AssetDatabase.GetCachedIcon("アセットのパス");
GUILayout.Label(texture);
}
//usingの外に出たためDisposeが呼ばれ、以降はデフォルトのサイズで表示される
意識しないといけなかった所がなくなって、呼び出すだけでよくなったためシンプルな構造になりました。
また、usingを使っているためこの中では32x32のサイズになっていると明示的に確認できるようになったため、他のアイコンも一緒に表示したいときにもこの中に入れれば表示されるというのがわかりやすくなったのも良い点だと思いました。
まとめ
IconSizeScopeはGUI.Scopeを継承しているため、コンストラクタでアイコンのサイズを変更し、解放処理で元のサイズに戻すことができました。
Scope系は他にもあると思いますので、調べたらまた記事にしたいと思います。