播放动画实例:
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();
}
}