using UnityEditor;
using UnityEngine;
namespace AibisDream.SystemEditor
{
public static class EditorKit
{
public static readonly GUIStyle BoldFont = new(EditorStyles.label)
{
fontStyle = FontStyle.Bold
};
public static int SortingLayerField(string label, int id)
{
// 先获取layer
var layers = GetSortingLayerNames();
// 将ID转为idx
var idx = TransSortingLayer2Idx(id);
var newIdx = EditorGUILayout.Popup(label, idx, layers);
return TransIdx2SortingLayer(newIdx);
}
///
/// 使用 SerializedProperty 绘制 SortingLayer 下拉菜单(基于ID)
///
/// 显示的标签
/// 存储排序层ID的 SerializedProperty(int 类型)
public static void SortingLayerField(GUIContent label, SerializedProperty property)
{
if (property == null || property.propertyType != SerializedPropertyType.Integer)
{
EditorGUILayout.HelpBox("Property must be an integer type for sorting layer ID.", MessageType.Error);
return;
}
EditorGUI.BeginChangeCheck();
// 获取所有排序层名称
string[] sortingLayerNames = GetSortingLayerNames();
// 将当前ID转为索引
int currentId = property.intValue;
int currentIndex = TransSortingLayer2Idx(currentId);
// 显示下拉菜单
int newIndex = EditorGUILayout.Popup(label, currentIndex, sortingLayerNames);
// 如果选择了新的排序层,更新属性值为新的ID
if (EditorGUI.EndChangeCheck() || newIndex != currentIndex)
{
int newId = TransIdx2SortingLayer(newIndex);
property.intValue = newId;
}
}
private static string[] GetSortingLayerNames()
{
// 获取所有 Sorting Layer 名称
var layerCount = SortingLayer.layers.Length;
var sortingLayerNames = new string[layerCount];
for (var i = 0; i < layerCount; i++)
{
sortingLayerNames[i] = SortingLayer.layers[i].name;
}
return sortingLayerNames;
}
private static int TransSortingLayer2Idx(int id)
{
var layers = SortingLayer.layers;
for (var i = 0; i < layers.Length; i++)
{
if (layers[i].id == id) return i;
}
return 0;
}
private static int TransIdx2SortingLayer(int idx)
{
if (idx < 0 || idx >= SortingLayer.layers.Length)
{
return SortingLayer.layers[0].id;
}
return SortingLayer.layers[idx].id;
}
public static void RecordObjectAndChildren(GameObject parent, string actionName)
{
Transform[] transforms = parent.GetComponentsInChildren(true);
Object[] objectsToUndo = new Object[transforms.Length];
for (int i = 0; i < transforms.Length; i++)
{
objectsToUndo[i] = transforms[i].gameObject;
}
Undo.RegisterCompleteObjectUndo(objectsToUndo, actionName);
}
}
}