【Unity】【エディタ拡張】インスペクタで入力不可(Disable)な属性を作る 
2019/09/01 Sun [edit]
インスペクタに表示するだけで、インスペクタからは入力はできないフィールドを作りたいときは良くある。デバッグ用に表示だけしたいときとかね。
サードパーティのインスペクタの拡張アセットなどにはよく付いているのだが、インポートするまでもなく、簡単に済ませたいときなどに便利なので掲載しておこう。何でもかんでもアセット導入すると、ファイルが増えすぎてビルド時間も長くなるしね。自作なら色々応用効くのも魅力だ(笑)。
(※) Unity 2018.4.8f1 / Windows10(x64) で確認
必要なスクリプトは PropertyAttribute を継承した属性用スクリプトと、PropertyDrawer を継承したエディタ(インスペクタ)用スクリプトになる。エディタ表示用スクリプトは「Editor」フォルダを作って、そこに置いておく必要がある。
・PropertyAttribute
・PropertyDrawer


●属性用スクリプト:DisableAttribute.cs
using UnityEngine;
public class DisableAttribute : PropertyAttribute
{
//※中身は空で良い
}
●エディタ表示用スクリプト:DisableDrawer.cs
using UnityEngine;
using UnityEditor;
[CustomPropertyDrawer(typeof(DisableAttribute))]
public class DisableDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false; //ここで入力不可にしている
EditorGUI.PropertyField(position, property, label, true);
GUI.enabled = true; //元に戻しておく
}
}
例として適当な GameObject にテスト用スクリプトをアタッチして、インスペクタの表示を見てみよう。


●テスト用スクリプト:DisableAttributeTest.cs(※名前は任意)
using UnityEngine;
public class DisableAttributeTest : MonoBehaviour
{
[Disable] public string str = "hoge"; //インスペクタからは入力できない
[SerializeField, Disable] int num = 1; //インスペクタからは入力できない
[HideInInspector] public float f = Mathf.PI; //※これは単にインスペクタに表示しない例
}
今回作ったのは "[Disable]" という属性だ。以前のバージョンでは "[DisableAttribute]" と書く必要があったらしいが、現在の Unity バージョンでは "Attribute" は省略できる。
"[HideInInspector]" は単に表示したくないときの属性で、元々 Unity にビルトインされている。他にも色々な属性があるので、少し古いが、以下に資料を載せておこう。
・UnityのAttribute(属性)についてまとめてメモる。
アセットによっては "[ReadOnly]" などになってるかもだが、C# Job System でも使われる属性なので、今後はコンフリクトするかも知れない。その場合は namespace を付けておくのも一つの手だ。もっと色々自作したいなら、以下も少し古いが、資料を載せておこう。
・自分だけのPropertyDrawerを作ろう!
(関連記事)
【Unity】インスペクタの値を保持したまま変数をリネームする
【Unity】【C#】インスペクタの配列やリストを並べ替え可能にする
【Unity】【C#】インスペクタの UnityEvent を並べ替え可能にする
【Unity】【C#】インスペクタでの UnityEvent のコールバック登録の有無を調べる
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録
【Unity】【C#】インスペクタの表示項目を動的に変更する
【Unity】【C#】独自のギズモ(Gizmo)を表示する
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/335-8adbdf82
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |