fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【エディタ拡張】インスペクタのフィールドに属性で色を付ける

【Unity】【エディタ拡張】インスペクタのフィールドに属性で色を付ける  


 以前インスペクタのフィールドを入力不可にする PropertyAttribute を作ったが、Unity2019.4 以降は Personal(無料)アカウントでもダークテーマを使えるようになったので、無効の色(グレー:たぶんアルファが低くなる)が少し見ずらく感じるようになったんだよね…。

●ライトテーマ(Unity2018)時の入力不可(Disable)属性を付けたフィールド

●ダークテーマ(Unity2020)での入力不可(Disable)属性を付けたフィールド


 なのでいっそのこと自分の好きな色にできないかとググったが、なぜか込み入ったコードしか見つからなかったので、Disable 属性と同じ要領で色を付けられるかと試してみたら、意外と簡単にできたので、コードを載せておこう。無効化とは併用できなかったが(グレーになってしまう)、自分でフィールドを色で見分けるくらいの用途なら十分に役に立つと思う。

(※) Unity 2020.3.34f1 / Windows10(x64) で確認

●デバッグ用途のフィールドに色を付ける例(属性):DebugFieldAttribute.cs
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Example
{
public class DebugFieldAttribute : PropertyAttribute
{
//※中身は空で良い
}

#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(DebugFieldAttribute))]
public class DebugFieldDrawer : PropertyDrawer
{
static readonly Color _color = Color.green; //色を指定

public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var tmpColor = GUI.color; //一時退避
GUI.color = _color;
EditorGUI.PropertyField(position, property, label, true);
GUI.color = tmpColor;
}
}
#endif
}

●クラス内部値用途のフィールドに色を付ける例(属性):InternalAttribute.cs
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Example
{
public class InternalFieldAttribute : PropertyAttribute
{
//※中身は空で良い
}

#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(InternalFieldAttribute))]
public class InternalFieldDrawer : PropertyDrawer
{
static readonly Color _color = Color.cyan; //色を指定

public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var tmpColor = GUI.color; //一時退避
GUI.color = _color;
EditorGUI.PropertyField(position, property, label, true);
GUI.color = tmpColor;
}
}
#endif
}

●実際にインスペクタで表示してみる例(メインコード等):FieldColorTest.cs
using UnityEngine;

public class FieldColorTest : MonoBehaviour
{
[SerializeField, DebugField] string debugValue = "hoge";
[SerializeField, InternalField] int internalValue = 123;
[SerializeField, Disable] float disableValue = 3.141592f; //Disable 属性は以前に作ったもの
[SerializeField] string normalValue = "piyo";
}

●ダークテーマ(Unity2020)での色を付けたフィールド

 今回はエディタスクリプト部分をプリプロセッサ(UNITY_EDITOR)で囲んでしまったが、Disable 属性のときのようにスクリプトを分けて「Editor」フォルダに PropertyDrawer を継承したスクリプトを置いても良い。"DebugField", "InternalField" の名前は任意なので、自分で好きに付けると良いだろう。とても簡単なスクリプトだが、名前と色だけ変えて使い回せば、インスペクタも結構見やすくなった。思いつきだったが、何個かあらかじめ定義しておけば、簡単に色分けで分類できて、意外と便利だったので、誰かの役に立つと嬉しい。


(PropertyAttribute, PropertyDrawer をもっと知りたいときは、以下を参照)
UnityのAttribute(属性)についてまとめてメモる。
自分だけのPropertyDrawerを作ろう!


(関連記事)
【Unity】【エディタ拡張】インスペクタで入力不可(Disable)な属性を作る
【Unity】インスペクタの値を保持したまま変数をリネームする
【Unity】【C#】インスペクタでの UnityEvent のコールバック登録の有無を調べる
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録
【Unity】【エディタ拡張】インスペクタの表示項目を動的に変更する
【Unity】【エディタ拡張】独自のギズモ(Gizmo)を表示する


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityリファレンス  インスペクタ  エディタ拡張 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/433-87cb11e0
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop