- 实现骨骼动画动作的切换,主要由美术提供Spine骨骼动画文件,里面有对应的动作action。该方式通过action名字进行切换指定的骨骼动作。
- 变身,将原来创建的游戏物体删掉,创建新的游戏物体绑定新的骨骼动画文件达到变身的目的。 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; using Spine; using Spine.Unity; using System; using System.Runtime.CompilerServices;
///
/// <summary>
/// 实例化
/// </summary>
/// <returns></returns>
public static SpineAnimationManage Instance()
{
if (manage == null)
{
manage = new SpineAnimationManage();
}
return manage;
}
/// <summary>
/// 动画播放
/// </summary>
/// <param name="sg">动画对象</param>
/// <param name="trackIndex">权重值:数值越大优先级越高</param>
/// <param name="action">指定动作</param>
/// <param name="actionDefault">默认动作</param>
/// <param name="loop">是否循环</param>
public void SpinePlayAnimation(SkeletonGraphic sg, int trackIndex, string action, string actionDefault, bool loop)
{
//var spineAnimation = assest.GetSkeletonData(false).FindAnimation(action);
if (!string.IsNullOrEmpty(action) && !string.IsNullOrEmpty(actionDefault))
{
if (loop)
{
sg.AnimationState.SetAnimation(trackIndex, action, loop);
}
else
{
sg.AnimationState.SetAnimation(trackIndex, action, loop).Complete += delegate
{
sg.AnimationState.SetAnimation(trackIndex, actionDefault, true);
};
}
}
}
/// <summary>
/// 动画按添加顺序播放
/// </summary>
/// <param name="flag">是否循环</param>
/// <param name="count">循环次数</param>
public static void SpinePlayDic(bool flag,int count)
{
if (flag)
{
//for (int i = 0; i < count; i++)
//{
// showDic();
//}
}
else
{
//showDic();
}
}
/// <summary>
/// 设置前一个动画向后一个动画之间平滑过渡的时间,切换的时候混合多少
/// </summary>
/// <param name="beforeName">前一个动画</param>
/// <param name="afterName">后一个动画</param>
/// <param name="time">平滑过渡的时间</param>
public static void SpineMix(AnimationStateData animStateData, string beforeName, string afterName, float time)
{
animStateData.SetMix(beforeName, afterName, time);
}
/// <summary>
/// 倍速播放,等于0 动画暂停,注意速度更改后为永久性的
/// </summary>
/// <param name="speed">播放速度</param>
public static void SpineSpeed(SkeletonGraphic skeletonGraphic, float speed)
{
skeletonGraphic.timeScale = speed;
}
/// <summary>
/// 从任意某一帧开始播放
/// </summary>
/// <param name="weight">权重值</param>
/// <param name="spineName">动画名称</param>
/// <param name="flag">是否循环</param>
/// <param name="frames">要开始的帧数</param>
public static void SpineAnyPointPlay(SkeletonGraphic skeletonGraphic, int weight, string spineName, bool flag, float frames)
{
skeletonGraphic.AnimationState.SetAnimation(weight, spineName, flag).TrackTime = frames / 30f;
}
}
```