Unity之InspectorGUI

Unity之InspectorGUI,在Inspector面板显示自定义的样式,下面的例子是自定义一个类,然后将该类中的属性显示在Inspector面板上,然后添加一些按钮(帮助操作),在此用编辑器类实现如下






创建  PathLevelPoint 脚本,将PathLevelPoint脚本内的属性在Inspector面板上自定义显示如上

PathLevelPoint脚本如下

using UnityEngine;
using System.Collections;

public class PathLevelPoint : MonoBehaviour { //路径关卡停止点

    public int startPath;           
    public float startPercentage; 
    
    public PathLevePointClass[] pathLevelPointClass;

}


其中 PathLevePointClass类定义如下

using UnityEngine;
using System.Collections;

[System.Serializable]
public class PathLevePointClass
{
    public GameObject cameraPathObj;  //路径
    public GameObject[] level;        //关卡
    public Vector3[] pointPostion;    //停止点时间

    public PathLevePointClass()
    {
        this.cameraPathObj = null;
    }

    public GameObject CameraPathObj
    {
        get { return cameraPathObj; }
        set { cameraPathObj = value; }
    }

    public GameObject[] Level
    {
        get { return level; }
        set { level = value; }
    }

    public Vector3[] PointPosition
    {
        get { return pointPostion; }
        set { pointPostion = value; }
    }
}


创建脚本PathLevelPointEditor, 将该脚本放在Editor文件夹下

代码如下

using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(PathLevelPoint))]
public class PathLevelPointEditor : Editor
{

    private PathLevePointClass[] pathLevelPointClassArray;
    private int pathLevelPointClassArrayCount = 0;

    private GameObject[] LevelGameObjectArray;
    private int levelGameObjectArrayCount = 0;

    private Vector3[] PointPostionArray;
    private int pointPostionArrayCount = 0;

    public override void OnInspectorGUI()
    {
        PathLevelPoint pathLevelPoint = (PathLevelPoint)target;

        pathLevelPoint.startPath = EditorGUILayout.IntField("Start Path", pathLevelPoint.startPath);
        pathLevelPoint.startPercentage = EditorGUILayout.FloatField("Start Percentage", pathLevelPoint.startPercentage);

        pathLevelPoint = CreatePathLevePointClass(pathLevelPoint);
    }

    private PathLevelPoint CreatePathLevePointClass(PathLevelPoint pathLevelPoint)
    {

        EditorGUILayout.BeginVertical("box");
        if (DrawHeader("Path Level Point", true, 0))
        {
            EditorGUI.indentLevel++;
            pathLevelPointClassArrayCount = pathLevelPoint.pathLevelPointClass.Length;

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Size", pathLevelPointClassArrayCount.ToString());
            if (GUILayout.Button("添 加", GUILayout.Width(50), GUILayout.Height(20)))
            {
                pathLevelPointClassArrayCount++;
                pathLevelPoint.pathLevelPointClass = SetGetPathLevelPoint(pathLevelPoint.pathLevelPointClass, pathLevelPointClassArrayCount);
            }
            if (GUILayout.Button("删 除", GUILayout.Width(50), GUILayout.Height(20)))
            {
                if (pathLevelPointClassArrayCount > 0)
                {
                    if (pathLevelPointClassArrayCount > 0)
                    {
                        pathLevelPointClassArrayCount--;
                        pathLevelPoint.pathLevelPointClass = SetGetPathLevelPoint(pathLevelPoint.pathLevelPointClass, pathLevelPointClassArrayCount);
                    }
                }
            }
            EditorGUILayout.EndHorizontal();
            GUILayout.Space(5);

            if (pathLevelPointClassArrayCount > 0)
            {
                for (int i = 0; i < pathLevelPoint.pathLevelPointClass.Length; i++)
                {
                    string pathLevelPointName = "pathLevelPoint " + i.ToString();

                    EditorGUILayout.BeginVertical("box");
                    if (DrawHeader(pathLevelPointName, true, 0))
                    {
                        pathLevelPoint.pathLevelPointClass[i] = CreatePathLevelPointClass(pathLevelPoint.pathLevelPointClass[i], i);
                    }
                    EditorGUILayout.EndVertical();

                    GUILayout.Space(5);
                }
            }
        }

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("  ", GUILayout.Width(200));
        if (GUILayout.Button("保  存", GUILayout.Width(50), GUILayout.Height(20)))
        {

        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.EndVertical();

        return pathLevelPoint;
    }

    private PathLevePointClass[] SetGetPathLevelPoint(PathLevePointClass[] pathlevelPointClassArr, int count)
    {
        if (count > 0)
        {
            pathLevelPointClassArray = new PathLevePointClass[count];
            for (int i = 0; i < count; i++)
            {
                pathLevelPointClassArray[i] = new PathLevePointClass();
            }

            for (int i = 0; i < pathlevelPointClassArr.Length; i++)
            {
                if (i < pathLevelPointClassArray.Length)
                {
                    pathLevelPointClassArray[i] = pathlevelPointClassArr[i];
                }
            }
            pathlevelPointClassArr = pathLevelPointClassArray;
        }
        else
        {
            pathLevelPointClassArray = new PathLevePointClass[0];
            pathlevelPointClassArr = new PathLevePointClass[0];
        }

        return pathlevelPointClassArr;
    }

    private PathLevePointClass CreatePathLevelPointClass(PathLevePointClass pathLevelPointClass, int num)
    {
        pathLevelPointClass.CameraPathObj = (GameObject)EditorGUILayout.ObjectField("Camera Path Obj", pathLevelPointClass.CameraPathObj, typeof(Object));
        pathLevelPointClass.Level = CreateLevel(pathLevelPointClass.Level, num);
        pathLevelPointClass.PointPosition = CreatePointPostion(pathLevelPointClass.PointPosition, num);
        return pathLevelPointClass;
    }

    private GameObject[] CreateLevel(GameObject[] levelObjArr, int num)
    {
        EditorGUILayout.BeginVertical("box");

        if (DrawHeader("Level " + num.ToString(), true, 10))
        {
            EditorGUI.indentLevel++;
            if (levelObjArr != null)
            {
                if (levelObjArr.Length > 0)
                {
                    levelGameObjectArrayCount = levelObjArr.Length;
                }
                else
                {
                    levelGameObjectArrayCount = 0;
                }
            }
            else
            {
                levelGameObjectArrayCount = 0;
            }

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Size", levelGameObjectArrayCount.ToString());
            if (GUILayout.Button("添 加", GUILayout.Width(50), GUILayout.Height(20)))
            {
                levelGameObjectArrayCount++;
                levelObjArr = SetGetLevel(levelObjArr, levelGameObjectArrayCount);
            }
            if (GUILayout.Button("删 除", GUILayout.Width(50), GUILayout.Height(20)))
            {
                if (levelGameObjectArrayCount > 0)
                {
                    if (levelGameObjectArrayCount > 0)
                    {
                        levelGameObjectArrayCount--;
                        levelObjArr = SetGetLevel(levelObjArr, levelGameObjectArrayCount);
                    }
                }
            }
            EditorGUILayout.EndHorizontal();
            GUILayout.Space(10);

            if (levelGameObjectArrayCount > 0)
            {
                for (int i = 0; i < levelObjArr.Length; i++)
                {
                    string levName = "Lev " + i.ToString();
                    levelObjArr[i] = (GameObject)EditorGUILayout.ObjectField(levName, levelObjArr[i], typeof(Object));
                }
            }

            EditorGUI.indentLevel--;
        }
        EditorGUILayout.EndVertical();
        return levelObjArr;
    }

    private GameObject[] SetGetLevel(GameObject[] levelObjArr, int count)
    {
        Debug.Log(count);
        if (count > 0)
        {
            LevelGameObjectArray = new GameObject[count];
            for (int i = 0; i < count; i++)
            {
                GameObject obj = null;
                LevelGameObjectArray[i] = obj;
            }
            if (levelObjArr != null)
            {
                for (int i = 0; i < levelObjArr.Length; i++)
                {
                    if (i < LevelGameObjectArray.Length)
                    {
                        LevelGameObjectArray[i] = levelObjArr[i];
                    }
                }
            }
            levelObjArr = LevelGameObjectArray;
        }
        else
        {
            LevelGameObjectArray = new GameObject[0];
            levelObjArr = new GameObject[0];
        }

        return levelObjArr;
    }

    private Vector3[] CreatePointPostion(Vector3[] vecArray, int num)
    {
        EditorGUILayout.BeginVertical("box");
        if (DrawHeader("Point Postion  " + num.ToString(), true, 10))
        {
            EditorGUI.indentLevel++;

            if (vecArray != null)
            {
                if (vecArray.Length > 0)
                {
                    pointPostionArrayCount = vecArray.Length;
                }
                else
                {
                    pointPostionArrayCount = 0;
                }
            }
            else
            {
                pointPostionArrayCount = 0;
            }

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Size", pointPostionArrayCount.ToString());
            if (GUILayout.Button("添 加", GUILayout.Width(50), GUILayout.Height(20)))
            {
                pointPostionArrayCount++;
                vecArray = SetGetPointPostionArrayLength(vecArray, pointPostionArrayCount);
            }
            if (GUILayout.Button("删 除", GUILayout.Width(50), GUILayout.Height(20)))
            {
                if (pointPostionArrayCount > 0)
                {
                    pointPostionArrayCount--;
                    vecArray = SetGetPointPostionArrayLength(vecArray, pointPostionArrayCount);
                }
            }
            EditorGUILayout.EndHorizontal();
            GUILayout.Space(10);

            if (pointPostionArrayCount > 0)
            {
                for (int i = 0; i < vecArray.Length; i++)
                {
                    EditorGUILayout.BeginHorizontal();
                    string pointName = "Pos  " + i.ToString();
                    vecArray[i] = EditorGUILayout.Vector3Field(pointName, vecArray[i]);
                    if (GUILayout.Button("复 制", GUILayout.Width(50), GUILayout.Height(20)))
                    {                   }
                    if (GUILayout.Button("粘 贴", GUILayout.Width(50), GUILayout.Height(20)))
                    {                  }
                    EditorGUILayout.EndHorizontal();
                    GUILayout.Space(5);
                }
            }
        }
        EditorGUILayout.EndVertical();

        return vecArray;
    }

    private Vector3[] SetGetPointPostionArrayLength(Vector3[] vecArray, int count)
    {
        if (count > 0)
        {
            PointPostionArray = new Vector3[count];
            for (int i = 0; i < count; i++)
            {
                PointPostionArray[i] = Vector3.zero;
            }
            if (vecArray != null)
            {
                for (int i = 0; i < vecArray.Length; i++)
                {
                    if (i < PointPostionArray.Length && vecArray.Length > 0)
                    {
                        PointPostionArray[i] = vecArray[i];
                    }
                }
            }
            vecArray = PointPostionArray;
        }
        else
        {
            PointPostionArray = new Vector3[0];
            vecArray = new Vector3[0];
        }

        return vecArray;
    }

    //摘自NGUI
    public bool DrawHeader(string text, bool isTrue, float offset) { return DrawHeader(text, text, offset, false, isTrue); }

    //摘自NGUI
    public bool DrawHeader(string text, string key, float offset, bool forceOn, bool minimalistic)
    {
        bool state = EditorPrefs.GetBool(key, true);

        if (!minimalistic) GUILayout.Space(3f);
        if (!forceOn && !state) GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f);
        GUILayout.BeginHorizontal();
        GUI.changed = false;

        if (minimalistic)
        {
            if (state) text = "\u25BC" + (char)0x200a + text;
            else text = "\u25BA" + (char)0x200a + text;

            GUILayout.BeginHorizontal();
            GUI.contentColor = EditorGUIUtility.isProSkin ? new Color(1f, 1f, 1f, 0.7f) : new Color(0f, 0f, 0f, 0.7f);
            GUILayout.Label("", GUILayout.Width(offset));
            if (!GUILayout.Toggle(true, text, "PreToolbar2", GUILayout.MinWidth(20f))) state = !state;
            GUI.contentColor = Color.white;
            GUILayout.EndHorizontal();
        }
        else
        {
            text = "<b><size=11>" + text + "</size></b>";
            if (state) text = "\u25BC " + text;
            else text = "\u25BA " + text;
            if (!GUILayout.Toggle(true, text, "dragtab", GUILayout.MinWidth(20f))) state = !state;
        }

        if (GUI.changed) EditorPrefs.SetBool(key, state);

        if (!minimalistic) GUILayout.Space(2f);
        GUILayout.EndHorizontal();
        GUI.backgroundColor = Color.white;
        if (!forceOn && !state) GUILayout.Space(3f);
        return state;
    }
}


































  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值