WXGame/box1/Assets/Script/Tool/InspectorGridDrawer.cs

87 lines
2.4 KiB
C#

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