トップ > 【Unity】エディター拡張方法をまとめます! > 【Unity】EditorGUIのObjectFieldの表示についてまとめます!
更新日 2022/9/20

【Unity】EditorGUIのObjectFieldの表示についてまとめます!

Unityオブジェクトを表示する便利なEditorGUI.ObjectField関数の詳細についてまとめます。

objectfieldvisualtype

調査した経緯

プロパティーの一覧を表示するウィンドウを作成していたときのお話です。
テクスチャを表示しようとしたら思うような結果が得られませんでした・・・。

objectfieldvisualtype_before

このようなことが良くありませんか?
この記事を見ればUnityオブジェクトを思いのままに表示できるようになります。

ObjectFieldVisualType_After

コード詳細

EditorGUI.ObjectField関数に関連するコードの話になります。
Unity内部のコードは公式GitHubにリファレンスコードが公開されています。

unity_cs_reference
【Unity】公式GitHubで公開されているリファレンスコードをゲットしよう!2022/7/7

ObjectFieldVisualTypeについて

ObjectField.cs 45行目に実装されています。

internal enum ObjectFieldVisualType { IconAndText, LargePreview, MiniPreview }

3種類の列挙子で表示を切り替えていそうです。


ObjectFieldVisualTypeの振り分けについて

ObjectField.cs 187行目に実装されています。

bool hasThumbnail = EditorGUIUtility.HasObjectThumbnail(objType);

// Determine visual type
ObjectFieldVisualType visualType = ObjectFieldVisualType.IconAndText;
if (hasThumbnail && position.height <= kObjectFieldMiniThumbnailHeight && position.width <= kObjectFieldMiniThumbnailWidth)
visualType = ObjectFieldVisualType.MiniPreview;
else if (hasThumbnail && position.height > kSingleLineHeight)
visualType = ObjectFieldVisualType.LargePreview;

主に幅や高さでObjectFieldVisualTypeが振り分けられています。


EditorGUIUtility.HasObjectThumbnail関数について

EditorGUIUtility.cs 1085行目に実装されています。

public static bool HasObjectThumbnail(Type objType)
{
return objType != null && (objType.IsSubclassOf(typeof(Texture)) || objType == typeof(Texture) || objType == typeof(Sprite));
}

この関数ではTextureとそのサブクラス、Spriteがtrueになります。


固定値について

固定値は以下のように定義されています。

internal const float kSingleLineHeight = 18f;
internal const float kObjectFieldMiniThumbnailHeight = 18f;
internal const float kObjectFieldMiniThumbnailWidth = 32f;

まとめ

以上を踏まえた上でまとまると次のような結果になります。

  1. テクスチャまたはスプライトで高さが18以下かつ幅が32以下の場合はMiniPreview
  2. テクスチャまたはスプライトで高さが18より大きい場合はLargePreview
  3. 上記以外はIconAndText

テクスチャとスプライト以外のオブジェクトはIconAndTextになります。


ObjectFieldVisualType一覧表

テクスチャとスプライトの表示テーブルです。

名前画像サイズ
IconAndTextIconAndText幅が32より大きくて高さが18以下
LargePreviewLargePreview高さが18より大きい
MiniPreviewMiniPreview幅32以下で高さが18以下

コード例

// IconAndText
EditorGUI.ObjectField(new Rect(0,0,160,18), texture, typeof(Texture), false);

// LargePreview
EditorGUI.ObjectField(new Rect(0,0,60,60), texture, typeof(Texture), false);

// MiniPreview
EditorGUI.ObjectField(new Rect(0,0,32,18), texture, typeof(Texture), false);

サイズのみで表示パターン3種類を切り替えることができます。
臨機応変に使い分けられると便利ですね。


関連ページ


Copyright ©2022 - 2024 うにぉらぼ