using System.IO; using UnityEditor; using UnityEngine; namespace AibisDream.SystemEditor { public class AnimationClipGenerator : EditorWindow { private Texture2D selectedTexture; private TextAsset selectedJson; private DefaultAsset outputFolder; private string outputPath = ""; // 动画类型选项 private enum AnimationTargetType { SpriteRenderer, // Sprite动画 Image // UIImage动画 } private AnimationTargetType animationType = AnimationTargetType.SpriteRenderer; [MenuItem("Tools/Animation Clip Generator")] public static void ShowWindow() { GetWindow("Animation Clip Generator"); } private void OnGUI() { GUILayout.Label("Animation Clip Generator", EditorStyles.boldLabel); EditorGUILayout.Space(); // 图片文件选择 EditorGUILayout.LabelField("图片文件 (PNG/JPG)", EditorStyles.boldLabel); selectedTexture = (Texture2D)EditorGUILayout.ObjectField( "Texture", selectedTexture, typeof(Texture2D), false); EditorGUILayout.Space(); // JSON文件选择 EditorGUILayout.LabelField("JSON文件", EditorStyles.boldLabel); selectedJson = (TextAsset)EditorGUILayout.ObjectField( "JSON", selectedJson, typeof(TextAsset), false); EditorGUILayout.Space(); // 动画类型选择 EditorGUILayout.LabelField("动画类型", EditorStyles.boldLabel); animationType = (AnimationTargetType)EditorGUILayout.EnumPopup( "Animation Type", animationType); EditorGUILayout.HelpBox( animationType == AnimationTargetType.SpriteRenderer ? "生成用于SpriteRenderer的动画(绑定到m_Sprite属性)" : "生成用于Unity UI Image的动画(绑定到m_Sprite属性)", MessageType.Info); EditorGUILayout.Space(); // 输出目录选择 EditorGUILayout.LabelField("输出目录", EditorStyles.boldLabel); outputFolder = (DefaultAsset)EditorGUILayout.ObjectField( "Output Folder", outputFolder, typeof(DefaultAsset), false); // 显示输出路径 if (outputFolder != null) { outputPath = AssetDatabase.GetAssetPath(outputFolder); EditorGUILayout.HelpBox($"输出路径: {outputPath}", MessageType.Info); } else { outputPath = ""; } EditorGUILayout.Space(); // 生成按钮 GUI.enabled = selectedTexture != null && selectedJson != null && outputFolder != null; if (GUILayout.Button("生成 AnimationClip", GUILayout.Height(30))) { GenerateAnimationClips(); } GUI.enabled = true; EditorGUILayout.Space(); // 说明信息 EditorGUILayout.HelpBox( "使用说明:\n" + "1. 选择PNG或JPG图片文件\n" + "2. 选择JSON文件(Aseprite格式或手动格式)\n" + "3. 选择输出目录\n" + "4. 点击生成按钮\n\n" + "注意: 如果图片的SpriteMode是Single,工具会自动根据JSON切图。", MessageType.Info); } private void GenerateAnimationClips() { if (selectedTexture == null || selectedJson == null || outputFolder == null) { EditorUtility.DisplayDialog("错误", "请选择图片文件、JSON文件和输出目录", "确定"); return; } string texturePath = AssetDatabase.GetAssetPath(selectedTexture); string jsonPath = AssetDatabase.GetAssetPath(selectedJson); // 验证文件扩展名 string textureExt = Path.GetExtension(texturePath).ToLower(); if (textureExt != ".png" && textureExt != ".jpg" && textureExt != ".jpeg") { EditorUtility.DisplayDialog("错误", "图片文件必须是PNG或JPG格式", "确定"); return; } try { bool isImageAnimation = animationType == AnimationTargetType.Image; AnimationClipGeneratorCore.GenerateClips(texturePath, jsonPath, outputPath, isImageAnimation); EditorUtility.DisplayDialog("成功", $"AnimationClip已生成到: {outputPath}", "确定"); // 刷新资源数据库 AssetDatabase.Refresh(); } catch (System.Exception e) { EditorUtility.DisplayDialog("错误", $"生成失败: {e.Message}", "确定"); Debug.LogError(e); } } } }