using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; public class GudieAnimationManager : MonoBehaviour { private Animator _animator; private string _currName; private List _actionList = new List(); private List _actionNameList = new List(); public float AnimationLength { get { float length = 0; AnimationClip[] clips = Animator.runtimeAnimatorController.animationClips; foreach (AnimationClip clip in clips) { if (ActionNameList.Contains(clip.name)) { length += clip.length; LogPrint.Log("clip.name:" + clip.name + " clip.length:" + clip.length); LogPrint.Log("length:" + length); } } return length; } } public Animator Animator { get { if (_animator == null) { _animator = transform.GetComponentInChildren(); } return _animator; } } public List ActionNameList { get { if (_actionNameList.Count != YogaManager.Instance.LevelData.Actions.Count) { _actionNameList.Clear(); foreach (var item in YogaManager.Instance.LevelData.Actions) { _actionNameList.Add(item.ToString()); } } return _actionNameList; } } private void Awake() { _animator = transform.GetComponentInChildren(); } public void Play(string name) { Animator.CrossFade(name, 0.5f); _currName = name; } public void PlayCurrentActionList(List actionList) { _actionList = actionList; Play(Enum.GetName(typeof(AvatarAction), _actionList[YogaManager.Instance.ActionIndex])); } private void Update() { if (string.IsNullOrEmpty(_currName) || _actionList.Count == 0) return; //当未达到指标且动画播放完毕时,重新播放 if (Animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f && GetCurrentAnimationName().Equals(Enum.GetName(typeof(AvatarAction), _actionList[YogaManager.Instance.ActionIndex]))) { //如果列表动画index小于列表长度,播放下一个动画 YogaManager.Instance.ActionIndex++; //如果列表动画index大于等于列表长度,说明动画播放完毕,停止播放 if (YogaManager.Instance.ActionIndex >= YogaManager.Instance.LevelData.Actions.Count) { Stop(); return; } Play(Enum.GetName(typeof(AvatarAction), _actionList[YogaManager.Instance.ActionIndex])); } } private string GetCurrentAnimationName() { if (Animator == null) { return string.Empty; } var clipInfo = Animator.GetCurrentAnimatorClipInfo(0); if (clipInfo.Length > 0) { var name = clipInfo[0].clip.name; return name; } return string.Empty; } public void Stop() { Animator.StopPlayback(); } }