// Copyright (c) 2025 EFramework Innovation. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
using UnityEditor;
using UnityEngine;
namespace EFramework.Unity.UIPlugin.Editor
{
///
/// UISpriteAnimation 组件的自定义编辑器,提供精灵动画的编辑界面和创建功能。
///
///
///
/// 功能特性
/// - 为 UISpriteAnimation 组件提供自定义 Inspector 界面
/// - 支持不同精灵模式的属性显示
/// - 提供便捷的精灵动画创建菜单
///
/// 更多信息请参考模块文档。
///
[CustomEditor(typeof(UISpriteAnimation), true)]
[CanEditMultipleObjects]
public class UISpriteAnimationEditor : UnityEditor.Editor
{
///
/// 精灵模式属性
///
private SerializedProperty spriteModeProp;
///
/// 图集属性
///
private SerializedProperty atlasProp;
///
/// 精灵前缀属性
///
private SerializedProperty spritesProp;
///
/// 帧率属性
///
private SerializedProperty frameRateProp;
///
/// 循环播放属性
///
private SerializedProperty loopProp;
///
/// 原始尺寸属性
///
private SerializedProperty nativeSizeProp;
///
/// 启用编辑器时初始化序列化属性。
///
protected virtual void OnEnable()
{
spriteModeProp = serializedObject.FindProperty("spriteMode");
atlasProp = serializedObject.FindProperty("sprites");
spritesProp = serializedObject.FindProperty("prefix");
frameRateProp = serializedObject.FindProperty("frameRate");
loopProp = serializedObject.FindProperty("loop");
nativeSizeProp = serializedObject.FindProperty("nativeSize");
}
///
/// 绘制自定义 Inspector 界面。
///
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(spriteModeProp, new GUIContent("SpriteMode"));
if (spriteModeProp.enumValueFlag == (int)UISpriteAnimation.SpriteMode.Atlas)
{
EditorGUILayout.PropertyField(atlasProp);
}
else if (spriteModeProp.enumValueFlag == (int)UISpriteAnimation.SpriteMode.Sprite)
{
EditorGUILayout.PropertyField(spritesProp);
}
EditorGUILayout.PropertyField(loopProp);
EditorGUILayout.PropertyField(nativeSizeProp);
EditorGUILayout.PropertyField(frameRateProp);
serializedObject.ApplyModifiedProperties();
}
///
/// 创建精灵动画的菜单项处理方法。
///
[MenuItem("GameObject/UI/Sprite Animation")]
private static void CreateTemplate()
{
EditorApplication.ExecuteMenuItem("GameObject/UI/Image");
var selected = Selection.activeGameObject;
selected.name = "Sprite Animation";
var spriteAnimation = selected.AddComponent();
var serialObj = new SerializedObject(spriteAnimation);
serialObj.ApplyModifiedProperties();
Selection.activeGameObject = selected;
Undo.RegisterCreatedObjectUndo(selected, "Create Sprite Animation");
}
}
}