浏览代码

新增:选中skeletonDataAsset后,在工具栏可自动创建动画控制器

SZAND\msx_2 7 月之前
父节点
当前提交
b2e7b9b332
共有 20 个文件被更改,包括 430 次插入318 次删除
  1. 67 0
      ActionTowerDefense/Assets/Editor/SkeletonDataReader.cs
  2. 1 1
      ActionTowerDefense/Assets/Resources/Prefab/BaGua/Demonic_Giant_Yang.prefab
  3. 1 1
      ActionTowerDefense/Assets/Resources/Prefab/BaGua/Demonic_Giant_Yin.prefab
  4. 1 1
      ActionTowerDefense/Assets/Resources/Prefab/Conduct/Demonic_BigGiant.prefab
  5. 1 1
      ActionTowerDefense/Assets/Resources/Prefab/Enemy/Enemy_Giant.prefab
  6. 1 1
      ActionTowerDefense/Assets/Resources/Prefab/MySoldier/Demonic_Giant.prefab
  7. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Enemy_FireDaoshi/Enemy_FireDaoshi_Controller.controller
  8. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Enemy_Ghost/Enermy_Ghost_Controller.controller
  9. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Enemy_Pig/Enermy_Pig_Controller.controller
  10. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Enemy_Piggy/Enemy_Piggy_Controller.controller
  11. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Enemy_Shrimp/Enermy_Shrimp_Controller.controller
  12. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Spirits_Assassin/Spirits_Assassin_Controller.controller
  13. 2 2
      ActionTowerDefense/Assets/Resources/Spine/Spirits_Cook/Spirits_Cook_Controller.controller
  14. 2 2
      ActionTowerDefense/Assets/Resources/Spine/demon_arrow/demon_arrow_Controller.controller
  15. 2 2
      ActionTowerDefense/Assets/Resources/Spine/demon_sword/demon_sword_Controller.controller
  16. 334 289
      ActionTowerDefense/Assets/Resources/Spine/demonic_giant/demon_giant_SkeletonData_Controller.controller
  17. 1 1
      ActionTowerDefense/Assets/Resources/Spine/demonic_giant/demon_giant_SkeletonData_Controller.controller.meta
  18. 1 1
      ActionTowerDefense/Assets/Resources/Spine/king_devil/king_deil_Controller.controller
  19. 2 2
      ActionTowerDefense/Assets/Resources/Spine/spirits_float/Spirits_Float_Controller.controller
  20. 2 2
      ActionTowerDefense/Assets/Scripts/Character.cs

+ 67 - 0
ActionTowerDefense/Assets/Editor/SkeletonDataReader.cs

@@ -7,6 +7,7 @@ using System.Linq;
 using System.IO;
 using System;
 using Spine;
+using UnityEditor.Animations;
 
 [InitializeOnLoad]
 public class SkeletonDataMonitor
@@ -298,5 +299,71 @@ public class SkeletonDataMonitor
             }
         }
     }
+
+    [MenuItem("Tools/Spine/Generate Simple Animator")]
+    public static void GenerateSimpleAnimator()
+    {
+        SkeletonDataAsset skeletonData = Selection.activeObject as SkeletonDataAsset;
+        if (skeletonData == null)
+        {
+            Debug.LogWarning("请先选择一个SkeletonDataAsset");
+            return;
+        }
+
+        // 1. 创建Animator Controller
+        string skeletonFolder = Path.GetDirectoryName(AssetDatabase.GetAssetPath(skeletonData));
+        string controllerName = $"{skeletonData.name}_Controller.controller";
+        string path = $"{skeletonFolder}/{controllerName}";
+        if (File.Exists(path))
+        {
+            AssetDatabase.DeleteAsset(path);
+        }
+
+        var controller = AnimatorController.CreateAnimatorControllerAtPath(path);
+
+        // 2. 获取Spine动画数据
+        var skeleton = skeletonData.GetSkeletonData(true);
+
+        // 3. 为每个动画创建空Clip并设置正确时长
+        foreach (var spineAnim in skeleton.Animations)
+        {
+            AnimationClip clip = new AnimationClip();
+            clip.name = spineAnim.Name;
+
+            // 设置Clip时长与Spine动画一致
+            SetClipLength(clip, spineAnim.Duration);
+
+            // 添加到Controller
+            AssetDatabase.AddObjectToAsset(clip, controller);
+            var state = controller.layers[0].stateMachine.AddState(clip.name);
+            state.motion = clip;
+        }
+
+        AssetDatabase.SaveAssets();
+        Debug.Log($"已生成包含 {skeleton.Animations.Count} 个动画的控制器");
+    }
+
+    static void SetClipLength(AnimationClip clip, float duration)
+    {
+        // 创建一个空曲线来设置时长
+        AnimationCurve curve = new AnimationCurve();
+        curve.AddKey(0, 0);
+        curve.AddKey(duration, 0);
+
+        // 绑定到任意属性(这里使用假属性)
+        AnimationUtility.SetEditorCurves(clip, new[] {
+            new EditorCurveBinding {
+                path = "",
+                type = typeof(GameObject),
+                propertyName = "m_IsActive"
+            }
+        }, new[] { curve });
+    }
+
+    [MenuItem("Tools/Spine/Generate Simple Animator", true)]
+    static bool ValidateGenerate()
+    {
+        return Selection.activeObject is SkeletonDataAsset;
+    }
 }
 #endif

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/BaGua/Demonic_Giant_Yang.prefab

@@ -961,7 +961,7 @@ Animator:
   m_GameObject: {fileID: 7208291223413765209}
   m_Enabled: 1
   m_Avatar: {fileID: 0}
-  m_Controller: {fileID: 9100000, guid: ad6a9c8454da7384fbf3ab86b52a8875, type: 2}
+  m_Controller: {fileID: 9100000, guid: 10b63b3d7b2bca74ca710fa15db1fc43, type: 2}
   m_CullingMode: 0
   m_UpdateMode: 0
   m_ApplyRootMotion: 0

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/BaGua/Demonic_Giant_Yin.prefab

@@ -961,7 +961,7 @@ Animator:
   m_GameObject: {fileID: 7208291223413765209}
   m_Enabled: 1
   m_Avatar: {fileID: 0}
-  m_Controller: {fileID: 9100000, guid: ad6a9c8454da7384fbf3ab86b52a8875, type: 2}
+  m_Controller: {fileID: 9100000, guid: 10b63b3d7b2bca74ca710fa15db1fc43, type: 2}
   m_CullingMode: 0
   m_UpdateMode: 0
   m_ApplyRootMotion: 0

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/Conduct/Demonic_BigGiant.prefab

@@ -915,7 +915,7 @@ Animator:
   m_GameObject: {fileID: 7208291223413765209}
   m_Enabled: 1
   m_Avatar: {fileID: 0}
-  m_Controller: {fileID: 9100000, guid: ad6a9c8454da7384fbf3ab86b52a8875, type: 2}
+  m_Controller: {fileID: 9100000, guid: 10b63b3d7b2bca74ca710fa15db1fc43, type: 2}
   m_CullingMode: 0
   m_UpdateMode: 0
   m_ApplyRootMotion: 0

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/Enemy/Enemy_Giant.prefab

@@ -925,7 +925,7 @@ Animator:
   m_GameObject: {fileID: 7208291223413765209}
   m_Enabled: 1
   m_Avatar: {fileID: 0}
-  m_Controller: {fileID: 9100000, guid: ad6a9c8454da7384fbf3ab86b52a8875, type: 2}
+  m_Controller: {fileID: 9100000, guid: 10b63b3d7b2bca74ca710fa15db1fc43, type: 2}
   m_CullingMode: 0
   m_UpdateMode: 0
   m_ApplyRootMotion: 0

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/MySoldier/Demonic_Giant.prefab

@@ -906,7 +906,7 @@ Animator:
   m_GameObject: {fileID: 7208291223413765209}
   m_Enabled: 1
   m_Avatar: {fileID: 0}
-  m_Controller: {fileID: 9100000, guid: ad6a9c8454da7384fbf3ab86b52a8875, type: 2}
+  m_Controller: {fileID: 9100000, guid: 10b63b3d7b2bca74ca710fa15db1fc43, type: 2}
   m_CullingMode: 0
   m_UpdateMode: 0
   m_ApplyRootMotion: 0

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Enemy_FireDaoshi/Enemy_FireDaoshi_Controller.controller

@@ -471,7 +471,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -846,7 +846,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Enemy_Ghost/Enermy_Ghost_Controller.controller

@@ -631,7 +631,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -834,7 +834,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Enemy_Pig/Enermy_Pig_Controller.controller

@@ -471,7 +471,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -846,7 +846,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Enemy_Piggy/Enemy_Piggy_Controller.controller

@@ -443,7 +443,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -818,7 +818,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Enemy_Shrimp/Enermy_Shrimp_Controller.controller

@@ -471,7 +471,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -846,7 +846,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Spirits_Assassin/Spirits_Assassin_Controller.controller

@@ -7,7 +7,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -1907,7 +1907,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/Spirits_Cook/Spirits_Cook_Controller.controller

@@ -167,7 +167,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions:
@@ -974,7 +974,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions:

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/demon_arrow/demon_arrow_Controller.controller

@@ -631,7 +631,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -834,7 +834,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/demon_sword/demon_sword_Controller.controller

@@ -471,7 +471,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -846,7 +846,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

文件差异内容过多而无法显示
+ 334 - 289
ActionTowerDefense/Assets/Resources/Spine/demonic_giant/demon_giant_SkeletonData_Controller.controller


+ 1 - 1
ActionTowerDefense/Assets/Resources/Spine/demonic_giant/demon_giant_Controller.controller.meta → ActionTowerDefense/Assets/Resources/Spine/demonic_giant/demon_giant_SkeletonData_Controller.controller.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: ad6a9c8454da7384fbf3ab86b52a8875
+guid: 10b63b3d7b2bca74ca710fa15db1fc43
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 9100000

+ 1 - 1
ActionTowerDefense/Assets/Resources/Spine/king_devil/king_deil_Controller.controller

@@ -417,7 +417,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions:

+ 2 - 2
ActionTowerDefense/Assets/Resources/Spine/spirits_float/Spirits_Float_Controller.controller

@@ -119,7 +119,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_summon
+  m_Name: attack_summon
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -145,7 +145,7 @@ AnimatorState:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: Attack_march
+  m_Name: attack_march
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []

+ 2 - 2
ActionTowerDefense/Assets/Scripts/Character.cs

@@ -349,7 +349,7 @@ public class Character : MonoBehaviour
 
     public virtual void Attack_summon()
     {
-        ani.Play("Attack_summon", 0, 0);
+        ani.Play("attack_summon", 0, 0);
         if (!isNonAttack)
         {
             if (attackType == AttackType.Shoot)
@@ -423,7 +423,7 @@ public class Character : MonoBehaviour
             }
         }
 
-        ani.Play("Attack_march", 0, 0);
+        ani.Play("attack_march", 0, 0);
         if (attackType == AttackType.Shoot)
         {
             foreach (AttackTrigger at in attackTriggers)

部分文件因为文件数量过多而无法显示