2014年4月22日火曜日

unityでInspectorの表示をカスタマイズする

Inspectorに表示されるプロパティをカスタマイズする方法。
Assetの中にEditorフォルダを作り(場所はどこでもいい風)
その中にカスタマイズさせたいクラスに対応したクラスを作成する。
具体的にはEditorを継承させ[CustomEditor(typeof(カスタマイズするクラス))]の属性を付ける。
OnInspectorGUIをオーバーライドして、その中でInspectorに表示される処理を書く。
targetが目的のインスタンスになっている。 こんな感じ
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(Params))]
public class ParamsDrawer : Editor
{
 public override void OnInspectorGUI()
 {
  Params p = (Params)target;

  EditorGUI.BeginChangeCheck();
  p.mName = EditorGUILayout.TextArea(p.mName);
  //update
  if (EditorGUI.EndChangeCheck())
  {
   Undo.RecordObject(target, "TestEditor");
   EditorUtility.SetDirty(target);
  }
 }
}

BeginChangeCheckやEndChangeCheckが何をやっているかというと
Undo対応のため変化があった事をUnityに知らせている。
これがないとCtrl+Yとかが効かない?

おまけ
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(Params))]
public class ParamsDrawer : Editor
{
 public override void OnInspectorGUI()
 {
  Params p = (Params)target;

  EditorGUI.BeginChangeCheck();

  EditorGUILayout.LabelField("hello world");
  p.mName = EditorGUILayout.TextArea(p.mName);
  EditorGUILayout.Slider(0, 0, 1);

  EditorGUILayout.BoundsField("Bounds:", new Bounds());
  EditorGUILayout.ColorField(new Color(255, 0, 0));
  EditorGUILayout.CurveField(new AnimationCurve(new Keyframe[] { new Keyframe(0, 0), new Keyframe(1, 1) }));
  EditorGUILayout.EnumMaskField(new Data());
  EditorGUILayout.EnumPopup(new Data());
  EditorGUILayout.FloatField(0.1f);
  bool re = EditorGUILayout.Foldout(true, "Foldout");
  if(re)
   EditorGUILayout.LabelField("");

  EditorGUILayout.HelpBox("Message", MessageType.Info);
  
    re = EditorGUILayout.InspectorTitlebar(true, p.gameObject.transform);
  
  if (re)
  {
   p.transform.localPosition = EditorGUILayout.Vector3Field("位置", p.transform.localPosition);
   p.transform.localEulerAngles = EditorGUILayout.Vector3Field("回転", p.transform.localEulerAngles);
   p.transform.localScale = EditorGUILayout.Vector3Field("サイズ", p.transform.localScale);
  }

  EditorGUILayout.IntField(0);
  EditorGUILayout.IntPopup(0, new GUIContent[] { new GUIContent("A", "Aです") 
   , new GUIContent("B", "Bです") }, new int[] { 0, 1 });
  EditorGUILayout.IntSlider(0, 0, 100);
  EditorGUILayout.LabelField("label");
  EditorGUILayout.LayerField(0);
  EditorGUILayout.MaskField( 0, new string[] {"A","B","C","D"});
  float f1 = 0, f2 = 10;
  EditorGUILayout.MinMaxSlider(ref f1, ref f2, 0, 20);
  EditorGUILayout.ObjectField(null, typeof(MonoBehaviour));
  EditorGUILayout.PasswordField("123456");
  EditorGUILayout.Popup(0, new GUIContent[] {new GUIContent("1","A"),
   new GUIContent("2","B"), new GUIContent("3","C")});
  EditorGUILayout.PrefixLabel("Prefix");
  //EditorGUILayout.PropertyField(new Test());
  EditorGUILayout.RectField(new Rect(0, 0, 320, 240));
  EditorGUILayout.SelectableLabel("SelectedLabel");
  EditorGUILayout.Slider(0, 0, 100);
  EditorGUILayout.Space();
  EditorGUILayout.TagField("Tag");
  EditorGUILayout.TextArea("text");
  EditorGUILayout.TextField("textfield");
  EditorGUILayout.Toggle("Check", true);
  EditorGUILayout.ToggleLeft("toggleleft", true);
  EditorGUILayout.Vector2Field("vec2", new Vector2());
  EditorGUILayout.Vector3Field("vec3", new Vector3());
  EditorGUILayout.Vector4Field("vec4", new Vector4());
  EditorGUILayout.Space();

  //update
  if (EditorGUI.EndChangeCheck())
  {
   Undo.RecordObject(target, "TestEditor");
   EditorUtility.SetDirty(target);
  }
 }

 public enum Data
 {
  A = 1,
  B = 2,
  C = 4,
  D = 8
 }
}

0 件のコメント: