首页 > 其他 > 详细

自定义Inspector检视面板

时间:2014-08-20 01:23:15      阅读:342      评论:0      收藏:0      [点我收藏+]
Unity中的Inspector面板可以显示的属性包括以下两类:
(1)C#以及Unity提供的基础类型;
(2)自定义类型,并使用[System.Serializable]关键字序列化,比如:
[System.Serializable]
public class TestClass
{
    public Vector3 vec = Vector3.zero;
    public Color clr = Color.green;
}

  也可以使用[System.NonSerialized]标记不需要显示的属性,比如:

public class TestClass
{
    [System.NonSerialized]
    public Vector3 vec = Vector3.zero;
}

  有的时候对于U3D默认的Inspector不能满足需求,则可以对特定类型的Inspector面板进行自定义:编写一个对应的Editor类,然后重写其OnInspector方法,比如我们有如下类型:

using UnityEngine;
using System.Collections;

[System.Serializable]
public class TestClass
{
    public Vector3 vec = Vector3.zero;
    [System.NonSerialized]
    public Color clr = Color.green;
}

[ExecuteInEditMode()]
[RequireComponent(typeof(TestComponent))]
public class TestInspector : MonoBehaviour 
{
    public Vector3 lookAtPoint = Vector3.zero;
    public Vector3 pos = Vector3.zero;
    public TestClass testObj = new TestClass();

    void Update()
    {
        transform.LookAt(lookAtPoint);
        transform.position = pos;
    }
}

  然后在Editor目录下添加如下脚本:

using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(TestInspector))]
public class TestInspectorEditor : Editor
{
    private SerializedObject obj;
    private SerializedProperty lookAtPoint;
    private SerializedProperty pos;
    private SerializedProperty testObj;

    // 添加TestInspector组件的GameObject被选中时触发该函数
    void OnEnable()
    {
        obj = new SerializedObject(target);
        lookAtPoint = obj.FindProperty("lookAtPoint");
        pos = obj.FindProperty("pos");
        testObj = obj.FindProperty("testObj");
    }

    // 重写Inspector检视面板
    public override void OnInspectorGUI()
    {
        obj.Update();

        EditorGUILayout.PropertyField(lookAtPoint);
        EditorGUILayout.PropertyField(pos);
        EditorGUILayout.PropertyField(testObj, true);   // 第二个参数表示有子节点需要显示

        obj.ApplyModifiedProperties();
    }

}

  在OnInspector函数中就可以实现你想要的效果。

   上面的代码中有几点需要注意:

  (1)[ExecuteInEditMode()]这个函数可以使代码在编辑模式下运行,不需要运行游戏;

  (2)TestInspectorEditor类必须继承自Editor,CustomEditor告诉U3D哪个组建类型需要自定义,OnInspectorGUI在显示组件的Inspector面板时调用;

  (3)SerializedObject序列化物体、SerializedProperty序列化属性和Editor这三者一起使用,用来访问和更新组件的属性,SeriailzedProperty能够以通用的方式访问所有的基础类型,包括数组的控制等。

   另外,可以在OnInspectorGUI中调用DrawDefaultInspector函数用来显示默认的监事面板内容。

   这篇帖子写得很不错:http://blog.csdn.net/lilanfei/article/details/7680802

自定义Inspector检视面板,布布扣,bubuko.com

自定义Inspector检视面板

原文:http://www.cnblogs.com/sifenkesi/p/3923616.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!