用PropertyDrawer自定义Inspector面板显示外观
2019年02月13日 11:53:25 萧_然 阅读数:22更多
个人分类: 工具
版权声明:欢迎大家留言讨论共同进步,转载请注明出处 https://blog.csdn.net/qq_39108767/article/details/87170224
举栗如图,将数组以二维矩阵的方式显示到Inspector面板
-
using UnityEngine;
-
using UnityEditor;
-
[System.Serializable]
-
public class InspectorGrid
-
{
-
public int rows;
-
public int columns;
-
[SerializeField]
-
bool[] enabledBools;
-
}
-
// ------
-
//用PropertyDrawer自定义Inspector面板显示外观
-
[CustomPropertyDrawer(typeof(InspectorGrid))]
-
public class InspectorGridDrawer : PropertyDrawer
-
{
-
float gridWidth = 15f;
-
float gridHeight = 15f;
-
float gridSpace = 1f;
-
int rows;
-
int columns;
-
//自定义面板显示
-
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
-
{
-
//position: 在Inspector面板的位置、大小
-
//property: 待绘制的属性
-
//label: 值的字段名
-
//绘制一个SerializedProperty的属性字段
-
EditorGUI.PropertyField(position, property, label, true);
-
//获取属性信息
-
SerializedProperty data = property.FindPropertyRelative("enabledBools");
-
rows = property.FindPropertyRelative("rows").intValue;
-
columns = property.FindPropertyRelative("columns").intValue;
-
if (rows < 0)
-
rows = 0;
-
if (columns < 0)
-
columns = 0;
-
//指定数组大小
-
data.arraySize = rows * columns;
-
//自定义显示区域
-
if (property.isExpanded)
-
{
-
int count = 0;
-
float targetX;
-
float targetY;
-
//遍历
-
for (int r = 0; r < rows; r++)
-
{
-
for (int c = 0; c < columns; c++)
-
{
-
//计算位置
-
targetX = position.xMin + ((gridWidth + gridSpace) * (c + 1));
-
targetY = 60 + position.yMin + (gridHeight + gridSpace) * (r + 1);
-
//位置、大小
-
Rect rect = new Rect(targetX, targetY, 15f * (EditorGUI.indentLevel + 1), gridHeight);
-
//绘制属性值
-
EditorGUI.PropertyField(rect, data.GetArrayElementAtIndex(count), GUIContent.none);
-
count++;
-
}
-
}
-
}
-
}
-
//自定义高度
-
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
-
{
-
//按照行数增加高度
-
if (property.isExpanded)
-
return EditorGUI.GetPropertyHeight(property) + 20 + (15 * (rows + 1));
-
return EditorGUI.GetPropertyHeight(property);
-
}
-
}
// 测试,Inspector面板显示如上图
-
using UnityEngine;
-
public class Test : MonoBehaviour
-
{
-
[SerializeField] InspectorGrid grid;
-
}