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;
}
}