动画相关(animator&Timeline)

播放动画实例:

if(_tweener!=null)
                _tweener.Kill();
            _tweener=  (m_FolderList.transform as RectTransform).DOAnchorPos(new Vector2(isZhanKai?1922:1069,-172), 1f).OnUpdate(() =>
            {
                Content.GetComponent<CanvasGroup>().alpha +=!isZhanKai? 0.02f:-0.02f;
            }).OnComplete(() =>
            {

             });

PlayerAnimator.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Playables;

/// <summary>
/// 操作模型-播放/跳过/暂停 动画
/// 操作模型-播放/跳过/暂停 Tmineline
/// </summary>
public class YX_PlayerAnimator : Singleton<YX_PlayerAnimator>
{
    private List<IEnumerator> allIE = new List<IEnumerator>();
    
    /// <summary>
    /// 关闭所有的动画携程
    /// </summary>
    public void CloseAllIE()
    {
        if(allIE==null)return;
        for (int i = 0; i < allIE.Count; i++)
        {
            StopCoroutine(allIE[i]);
        }
        allIE.Clear();
    }

    /// <summary>
    /// 播放动画
    /// </summary>
    /// <param name="ani">需要播放动画的组件</param>
    /// <param name="playName">动画名称</param>
    /// <param name="action">动画完成后的事件</param>
    public void PlayerAnimator(Animator ani, string playName, Action action = null)
    {
        if (AnimationCtrl.GetInstance().IE_Animation != null)
        {
            StopCoroutine(AnimationCtrl.GetInstance().IE_Animation);
        }
        //开启播放动画
        var ie= AnimationCtrl.GetInstance().WriteAnimatorInfor( IEPlayerAniamtor(ani,     playName, action),ani);
        if(allIE!.Contains(ie))
            allIE.Add(ie);
        StartCoroutine(ie);
     
    }

    /// <summary>
    /// 播放动画
    /// </summary>
    /// <param name="animator">需要播放动画的组件</param>
    /// <param name="playName">动画名称</param>
    /// <param name="action">动画完成后的事件</param>
    /// <returns></returns>
    private IEnumerator IEPlayerAniamtor(Animator animator, string playName, Action action = null)
    {
        AnimationCtrl.GetInstance().StartAnimator();
        animator.enabled = true;
        animator.Play(playName, 0, 0);
        float coutTime=0;
        while (coutTime<animator.GetCurrentAnimatorStateInfo(0).length&&! AnimationCtrl.GetInstance().IsClickSkipBtn)
        {
            coutTime += Time.deltaTime;
            yield return new  WaitForFixedUpdate();
        }
animator.Play(playName, 0, 0.99f);
        yield return null;
        
        animator.enabled = false;
        AnimationCtrl.GetInstance().EndAniamtor();
      
    
        action?.Invoke();

    }

    // <summary>
    /// 暂停动画播放
    /// </summary>
    /// <param name="ani">需要播放动画的物体</param>
    /// <param name="action">完成后的事件</param>
    public void StopAnimator(GameObject ani, Action action = null)
    {
        if (ani.GetComponent<Animator>())
        {
            //暂停播放动画
            ani.GetComponent<Animator>().speed = 0;
        }

        action?.Invoke();
    }

     /// <summary>
    /// 继续播放动画
    /// </summary>
    /// <param name="ani">需要播放动画的物体</param>
    /// <param name="action">完成后的事件</param>
    public void RePalyAnimator(GameObject ani, Action action = null)
    {
        if (ani.GetComponent<Animator>())
        {
            // 继续播放动画
            ani.GetComponent<Animator>().speed = 1;
        }

        action?.Invoke();
    }

    /// <summary>
    /// 播放 Timelne
    /// </summary>
    /// <param name="ani">需要播放 Timelne 的组件</param>
    /// <param name="action">完成后的事件</param>
public void PlayerTimeline(PlayableDirector ani,float startTime,float endTime, Action action = null)
    {
        if ( AnimationCtrl.GetInstance().IE_TimeLine != null)
        {
            StopCoroutine( AnimationCtrl.GetInstance().IE_TimeLine);
        }
 //开启播放 Timeline 动画
       var ie= AnimationCtrl.GetInstance().WriteTimelineInfor(IEPlayerTimeline(ani,startTime,endTime, action),ani);
       if(allIE!.Contains(ie))
           allIE.Add(ie);
       StartCoroutine(ie);
    }

/// <summary>
    /// 播放 Timelne 的协程
    /// </summary>
    /// <param name="animator">需要播放Timelne的组件</param>
    /// <param name="action">完成后的事件</param>
    /// <returns></returns>
 private IEnumerator IEPlayerTimeline(PlayableDirector animator,float startTime,float endTime, Action action = null)
    {
        AnimationCtrl.GetInstance().StartAnimator();
        animator.enabled = true;
        yield return null;
        animator.time = startTime;
        animator.Play();
        if(animator.playableGraph.IsValid())
            animator.playableGraph.GetRootPlayable(0).SetSpeed(1);
float coutTime=0;
        while (coutTime<endTime-startTime+0.05f&&!AnimationCtrl.GetInstance().IsClickSkipBtn)
        {
            //Debug.LogError("当前时间"+animator.time);
            coutTime += Time.deltaTime;
            yield return new  WaitForFixedUpdate();
        }
        AnimationCtrl.GetInstance().EndAniamtor();
        animator.time = endTime;
 yield return null;
        animator.enabled = false;
        action?.Invoke();
    }

/// <summary>
    /// 暂停 Timeline 播放
    /// </summary>
    /// <param name="ani">需要播放Timelne的物体</param>
    /// <param name="action">完成后的事件</param>
    public void StopTimeLine(GameObject ani, Action action = null)
{
        if (ani.GetComponent<PlayableDirector>())
        {
            //暂停播放 Timeline 动画
            ani.GetComponent<PlayableDirector>().Pause();
        }

        action?.Invoke();
    }

 /// <summary>
    /// 继续播放 Timeline
    /// </summary>
    /// <param name="ani">需要播放Timelne的物体</param>
    /// <param name="action">完成后的事件</param>
    public void RePalyTimeLine(GameObject ani, Action action = null)
{
        if (ani.GetComponent<PlayableDirector>())
        {
            // 继续播放 Timeline 动画
            ani.GetComponent<PlayableDirector>().Resume();
        }

        action?.Invoke();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值