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