using System.Collections; using System.Collections.Generic; using UnityEngine; using ChivaXR; using Sirenix.OdinInspector; using System; using System.Linq; public class AniDriver_IntervalAnimation : AnimationDriverBase { [SerializeField] private Animation m_Animation; [ValueDropdown("GetAllAnimationNames")] [SerializeField] private string m_AniName; [LabelWidth(50)] [LabelText("起始帧")] [SerializeField] private int m_StartFrame; [LabelWidth(50)] [LabelText("结束帧")] [SerializeField] private int m_EndFrame; [LabelWidth(100)] [LabelText("动画帧率")] [SerializeField] private int m_AniFPS = 30; [LabelWidth(100)] [LabelText("播放速度")] [SerializeField] private float m_Speed = 1; private AnimationState m_AniState; /// /// 当前帧数 /// private int m_CurrentFrame = 0; public override void FinishedState() { } public override void InitState() { if (m_Animation == null || string.IsNullOrEmpty(m_AniName)) { return; } m_AniState = m_Animation[m_AniName]; } public override void StartPlay(Action finishedCallBack = null) { StartAniCoroutine(PlayAnimation(finishedCallBack)); } /// /// 获取动画名称信息 /// /// private IEnumerable GetAllAnimationNames() { return AnimationManager.Instance.animationDatas.Select(value => new ValueDropdownItem(value.AniDataName, value.AniDataName)); } private IEnumerator PlayAnimation(Action finishedCallBack) { yield return new WaitForSeconds(m_StartFrame / m_AniFPS); while (m_CurrentFrame < m_EndFrame) { ChangeAniDataProcess(m_CurrentFrame / m_AniFPS); m_CurrentFrame++; } finishedCallBack?.Invoke(); } /// /// 改变动画进度 /// /// private void ChangeAniDataProcess(float _value) { if (m_Animation == null || m_AniState == null) { return; } m_AniState.enabled = true; m_AniState.speed = 0; m_AniState.weight = 1; m_AniState.normalizedTime = _value; m_Animation.Sample(); m_AniState.enabled = false; } }