Files
aibis-dream/Assets/Editor/Inspector/SpriteGroupEditor.cs
T
2025-03-05 14:13:33 +08:00

190 lines
5.6 KiB
C#

using System.Linq;
using AibisDream.Framework;
using UnityEditor;
using UnityEngine;
namespace AibisDream.SystemEditor
{
[CustomEditor(typeof(SpriteGroupKit))]
public class SpriteGroupEditor : Editor
{
private int _stateIdx;
private string _curState;
private int _curLayer;
public override void OnInspectorGUI()
{
// 获取对象
var example = (SpriteGroupKit)target;
// 先绘制默认的 Inspector
DrawDefaultInspector();
#region UI
LoadUIPart(example); // 加载
EditorGUILayout.Separator();
SwitchStateUIPart(example); // 状态管理
EditorGUILayout.Separator();
ReorderLayer(example); // 重排序
EditorGUILayout.Separator();
SaveUIPart(example); // 保存
#endregion
}
private void LoadUIPart(SpriteGroupKit example)
{
EditorGUILayout.LabelField("加载图片集", EditorKit.BoldFont);
example.config.key = EditorGUILayout.TextField("唯一索引", example.config.key);
example.spriteGroup =
EditorGUILayout.ObjectField("PSD文件", example.spriteGroup, typeof(GameObject), true) as GameObject;
#region 加载按钮
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("按PSD加载"))
{
if (example.spriteGroup)
{
var option = ShowWarningDialog();
if (option == 0)
{
example.InstantiateByPsd();
ReLoad();
}
}
else
{
Debug.Log("PSD没有设置");
}
}
if (GUILayout.Button("按索引加载"))
{
if (!string.IsNullOrEmpty(example.config.key))
{
var option = ShowWarningDialog();
if (option == 0)
{
example.InstantiateByConfig();
ReLoad();
}
}
else
{
Debug.Log("PSD没有设置");
}
}
EditorGUILayout.EndHorizontal();
#endregion
}
private void SwitchStateUIPart(SpriteGroupKit example)
{
EditorGUILayout.LabelField("状态切换", EditorKit.BoldFont);
EditorGUILayout.BeginHorizontal();
var stateArray = example.config.StateDict.Keys.ToArray();
var newIndex = EditorGUILayout.Popup(_stateIdx, stateArray);
_curState = EditorGUILayout.TextField(_curState);
if (newIndex != _stateIdx && newIndex >= 0 && newIndex < stateArray.Length)
{
_stateIdx = newIndex;
_curState = stateArray[newIndex];
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("保存为状态"))
{
OnSaveStateClick(example);
}
if (GUILayout.Button("加载状态"))
{
OnLoadStateClick(example);
}
EditorGUILayout.EndHorizontal();
}
private void OnSaveStateClick(SpriteGroupKit example)
{
if (!string.IsNullOrEmpty(_curState))
{
example.SaveState(_curState);
}
else
{
Debug.Log("状态名不能为空");
}
}
private void OnLoadStateClick(SpriteGroupKit example)
{
if (!string.IsNullOrEmpty(_curState) && example.config.StateDict.ContainsKey(_curState))
{
Undo.RecordObject(example, "加载状态");
example.SwitchState(_curState);
EditorUtility.SetDirty(example);
}
else
{
Debug.Log("状态名不能为空");
}
}
private void ReorderLayer(SpriteGroupKit example)
{
EditorGUILayout.LabelField("显示层级", EditorKit.BoldFont);
example.config.layerId = EditorKit.SortingLayerField("目标层级", example.config.layerId);
EditorGUILayout.BeginHorizontal();
example.config.maxLayer = EditorGUILayout.IntField("max", example.config.maxLayer);
example.config.minLayer = EditorGUILayout.IntField("min", example.config.minLayer);
EditorGUILayout.EndHorizontal();
if (GUILayout.Button("重排序"))
{
Undo.RecordObject(example, "重排序");
example.Reorder();
EditorUtility.SetDirty(example);
}
}
private void SaveUIPart(SpriteGroupKit example)
{
EditorGUILayout.LabelField("保存图片集", EditorKit.BoldFont);
if (GUILayout.Button("保存"))
{
example.SaveSpriteGroup();
}
}
private void ReLoad()
{
// 清空编辑器数据
_stateIdx = -1;
_curState = "";
}
private int ShowWarningDialog()
{
return EditorUtility.DisplayDialogComplex(
"Warning",
"点击后会清除当前的图集,请提前保存",
"OK",
"Cancel",
string.Empty
);
}
}
}