1. 实现骨骼动画动作的切换,主要由美术提供Spine骨骼动画文件,里面有对应的动作action。该方式通过action名字进行切换指定的骨骼动作。
    2. 变身,将原来创建的游戏物体删掉,创建新的游戏物体绑定新的骨骼动画文件达到变身的目的。 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; using Spine; using Spine.Unity; using System; using System.Runtime.CompilerServices;

    ///

    /// Spine骨骼动画 /// public class SpineAnimationManage { private static SpineAnimationManage manage = null;

    1. /// <summary>
    2. /// 实例化
    3. /// </summary>
    4. /// <returns></returns>
    5. public static SpineAnimationManage Instance()
    6. {
    7. if (manage == null)
    8. {
    9. manage = new SpineAnimationManage();
    10. }
    11. return manage;
    12. }
    13. /// <summary>
    14. /// 动画播放
    15. /// </summary>
    16. /// <param name="sg">动画对象</param>
    17. /// <param name="trackIndex">权重值:数值越大优先级越高</param>
    18. /// <param name="action">指定动作</param>
    19. /// <param name="actionDefault">默认动作</param>
    20. /// <param name="loop">是否循环</param>
    21. public void SpinePlayAnimation(SkeletonGraphic sg, int trackIndex, string action, string actionDefault, bool loop)
    22. {
    23. //var spineAnimation = assest.GetSkeletonData(false).FindAnimation(action);
    24. if (!string.IsNullOrEmpty(action) && !string.IsNullOrEmpty(actionDefault))
    25. {
    26. if (loop)
    27. {
    28. sg.AnimationState.SetAnimation(trackIndex, action, loop);
    29. }
    30. else
    31. {
    32. sg.AnimationState.SetAnimation(trackIndex, action, loop).Complete += delegate
    33. {
    34. sg.AnimationState.SetAnimation(trackIndex, actionDefault, true);
    35. };
    36. }
    37. }
    38. }
    39. /// <summary>
    40. /// 动画按添加顺序播放
    41. /// </summary>
    42. /// <param name="flag">是否循环</param>
    43. /// <param name="count">循环次数</param>
    44. public static void SpinePlayDic(bool flag,int count)
    45. {
    46. if (flag)
    47. {
    48. //for (int i = 0; i < count; i++)
    49. //{
    50. // showDic();
    51. //}
    52. }
    53. else
    54. {
    55. //showDic();
    56. }
    57. }
    58. /// <summary>
    59. /// 设置前一个动画向后一个动画之间平滑过渡的时间,切换的时候混合多少
    60. /// </summary>
    61. /// <param name="beforeName">前一个动画</param>
    62. /// <param name="afterName">后一个动画</param>
    63. /// <param name="time">平滑过渡的时间</param>
    64. public static void SpineMix(AnimationStateData animStateData, string beforeName, string afterName, float time)
    65. {
    66. animStateData.SetMix(beforeName, afterName, time);
    67. }
    68. /// <summary>
    69. /// 倍速播放,等于0 动画暂停,注意速度更改后为永久性的
    70. /// </summary>
    71. /// <param name="speed">播放速度</param>
    72. public static void SpineSpeed(SkeletonGraphic skeletonGraphic, float speed)
    73. {
    74. skeletonGraphic.timeScale = speed;
    75. }
    76. /// <summary>
    77. /// 从任意某一帧开始播放
    78. /// </summary>
    79. /// <param name="weight">权重值</param>
    80. /// <param name="spineName">动画名称</param>
    81. /// <param name="flag">是否循环</param>
    82. /// <param name="frames">要开始的帧数</param>
    83. public static void SpineAnyPointPlay(SkeletonGraphic skeletonGraphic, int weight, string spineName, bool flag, float frames)
    84. {
    85. skeletonGraphic.AnimationState.SetAnimation(weight, spineName, flag).TrackTime = frames / 30f;
    86. }

    }

    ```