Spine2D动画一些常用的方法总结

Spine动画常用方法总结,可以通过下面两个脚本实现自己想要的效果

1、管理脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine;
using Spine.Unity;
using System;
using System.Runtime.CompilerServices;

public class SpineManage : MonoBehaviour
{
    static SkeletonAnimation skeletonAnimation;//骨骼动画
    static AnimationStateData animStateData;//动画状态数据
    Spine.AnimationState saState;//动画状态
    static Dictionary<int, string> playDic = new Dictionary<int, string>();
    // Start is called before the first frame update
    void Start()
    {
        skeletonAnimation = GetComponent<SkeletonAnimation>();
        saState = skeletonAnimation.AnimationState;
        animStateData = skeletonAnimation.SkeletonDataAsset.GetAnimationStateData();
        
        //ExposedList<Spine.Animation> animations = skeletonAnimation.skeleton.Data.Animations;
        //Debug.Log(animations.Count);
        //for (int i = 0, n = animations.Count; i < n; i++)
        //{
        //    Spine.Animation animation = animations.Items[i];
        //    Debug.Log(animation.Duration);
        //}
    }

    /// <summary>
    /// 动画添加
    /// </summary>
    /// <param name="weight">权重值:数字越大优先级越高</param>
    /// <param name="spineName">动画名称</param>
    /// <param name="flag">是否循环</param>
    /// <param name="delay">延迟系数</param>
    public static void SpineAdd(int weight, string spineName, bool flag, float delay)
    {
        skeletonAnimation.AnimationState.AddAnimation(weight, spineName, flag, delay);
        var trackEntry = skeletonAnimation.state.GetCurrent(0);
    }

    /// <summary>
    /// 动画播放
    /// </summary>
    /// <param name="weight">权重值:数字越大优先级越高</param>
    /// <param name="spineName">动画名称</param>
    /// <param name="flag">是否循环</param>
    public static void SpinePlay(int weight, string spineName, bool flag)
    {
        skeletonAnimation.AnimationState.SetAnimation(weight, spineName, flag);
    }

    /// <summary>
    /// 动画按添加顺序播放(是否循环)
    /// </summary>
    public static void SpinePlayDic(bool flag)
    {
        if (flag)
        {
            for (int i = 0; i < 30; i++)
            {
                showDic();
            }
        }
        else
        {
            showDic();
        }
    }

    /// <summary>
    /// 遍历播放字典
    /// </summary>
    private static void showDic()
    {
        foreach (string str in playDic.Values)
        {
            skeletonAnimation.AnimationState.AddAnimation(0, str, false, 0f);
        }
    }

    /// <summary>
    /// 设置前一个动画向后一个动画之间平滑过渡的时间,切换的时候混合多少
    /// </summary>
    /// <param name="beforeName">前一个动画</param>
    /// <param name="afterName">后一个动画</param>
    /// <param name="time">平滑过渡的时间</param>

    public static void SpineMix(string beforeName, string afterName, float time)
    {
        animStateData.SetMix(beforeName, afterName, time);
    }

    /// <summary>
    /// 倍速播放,等于0 动画暂停
    /// </summary>
    /// <param name="speed">播放速度</param>
    public static void SpineSpeed(float speed)
    {
        skeletonAnimation.timeScale = speed;
    }

    /// <summary>
    /// 从任意某一帧开始播放
    /// </summary>
    /// <param name="weight">权重值</param>
    /// <param name="spineName">动画名称</param>
    /// <param name="flag">是否循环</param>
    /// <param name="frames">要开始的帧数</param>
    public static void SpineAnyPointPlay(int weight, string spineName, bool flag, float frames)
    {
       skeletonAnimation.state.SetAnimation(weight, spineName, flag).Time = frames / 30f;
    }

    /// <summary>
    ///  添加播放队列的播放动画.
    ///  建议按照播放顺序添加,注意播放顺序int,如有重复,后添加的会覆盖原来的
    /// </summary>
    /// <param name="location">顺序</param>
    /// <param name="spineName">动画名字</param>
    public static void SpineAddDic(int location, string spineName)
    {
        if (!playDic.ContainsKey(location))
        {
            playDic.Add(location, spineName);
        }
        else
        {
            playDic.Remove(location);
            playDic.Add(location, spineName);
        }
    }

    /// <summary>
    /// 动画左右翻转
    /// </summary>
    [Obsolete]
    public static void SpineRotat(bool flag, GameObject model)
    {
        if (flag)
        {
            //skeletonAnimation.skeleton.FlipX = true;
            model.transform.localScale = new Vector3(1, 1, 1);
        }
        else
        {
           //skeletonAnimation.skeleton.FlipX = false;
            model.transform.localScale = new Vector3(-1, 1, 1);
        }
    }
}

2、Spine动画一些常用的方法

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameStart : MonoBehaviour
{
    public GameObject Model;
    Text text;
    float timers = 0f;
    //停止参数
    public string Qname;
    //播放参数
    public string Wname;
    //慢速播放
    public float Espeed;
    //快速播放
    public float Rspeed;
    //顺序播放
    public List<string> Slist = new List<string>();
    //动画融合
    public string Lname;
    public string Rname;
    public float timess;
    void Start()
    {
        Model.AddComponent<SpineManage>();
        text = GameObject.Find("timer").GetComponent<Text>();
    }

    [Obsolete]
    void Update()
    {
        //停止
        if (Input.GetKeyDown(KeyCode.Q))
        {
            SpineManage.SpinePlay(0, Qname, false);
        }
        //播放
        if (Input.GetKeyDown(KeyCode.W))
        {
            SpineManage.SpinePlay(0, Wname, true);
        }
        //慢速
        if (Input.GetKeyDown(KeyCode.E))
        {
            SpineManage.SpineSpeed(Espeed);
        }
        //快速
        if (Input.GetKeyDown(KeyCode.R))
        {
            SpineManage.SpineSpeed(Rspeed);
        }
        //暂停
        if (Input.GetKeyDown(KeyCode.T))
        {
            SpineManage.SpineSpeed(0f);
        }
        //继续
        if (Input.GetKeyDown(KeyCode.Y))
        {
            SpineManage.SpineSpeed(1f);
        }
        //添加
        if (Input.GetKeyDown(KeyCode.U))
        {
            for (int i = 0; i < Slist.Count; i++)
            {
                SpineManage.SpineAddDic(i, Slist[i]);
            }
        }
        //按照添加好的顺序播放
        if (Input.GetKeyDown(KeyCode.I))
        {
            SpineManage.SpinePlayDic(true);
        }
        //动画融合
        if (Input.GetKeyDown(KeyCode.P))
        {
            SpineManage.SpineMix(Lname, Rname, timess);
        }
        //延时
        if (Input.GetKeyDown(KeyCode.U))
        {
            SpineManage.SpineAdd(0, "qianjin2", false, 5f);
        }
        //向左转
        if (Input.GetKeyDown(KeyCode.A))
        {
            SpineManage.SpineRotat(true, Model);
        }
        //向右转
        if (Input.GetKeyDown(KeyCode.D))
        {
            SpineManage.SpineRotat(false, Model);
        }
        timers += Time.deltaTime;
        text.text = timers.ToString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶等风12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值