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;
}
}