using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ChivaXR
{
///
/// 动画执行顺序
///
public enum AnimationSequence
{
synchronization, //同步执行下一步
waitFinished //等待当前动画完成,执行一下状态
}
public enum Animation_State
{
initState,
finishedState
}
public interface IAniState
{
void InitState(); //初始化状态
void FinishedState(); //结束状态
}
public class AnimationDriver
{
///
/// 播放动画组
///
///
///
public static void PlayAniDrivers(AnimationDriverBase[] aniDrivers, Action finishedCallBack = null)
{
AnimationCoroutine.Instance.StartCoroutine(PlayAniDriversLinner(aniDrivers, finishedCallBack));
}
public static void StopAllAnimation()
{
AnimationCoroutine.Instance.StopAllCoroutines();
}
///
/// 线性播放动画
///
///
///
///
private static IEnumerator PlayAniDriversLinner(AnimationDriverBase[] aniDrivers, Action finishedCallBack)
{
//等待一帧,防止部分冲突
yield return new WaitForEndOfFrame();
for (int i = 0; i < aniDrivers.Length; i++)
{
bool finishedCurrentAniDriver = false;
switch (aniDrivers[i].animationSequence)
{
case AnimationSequence.synchronization:
aniDrivers[i].StartPlay();
finishedCurrentAniDriver = true;
break;
case AnimationSequence.waitFinished:
aniDrivers[i].StartPlay(() => finishedCurrentAniDriver = true);
break;
}
while (!finishedCurrentAniDriver)
{
yield return new WaitForEndOfFrame();
}
}
finishedCallBack?.Invoke();
}
///
/// 设置AniDrivers状态组
///
///
///
public static void SetAniDriversState(AnimationDriverBase[] aniDrivers, Animation_State aniState)
{
switch (aniState)
{
case Animation_State.initState:
for (int i = aniDrivers.Length - 1; i >= 0; i--)
{
aniDrivers[i].InitState();
}
break;
case Animation_State.finishedState:
for (int i = 0; i < aniDrivers.Length; i++)
{
aniDrivers[i].FinishedState();
}
break;
}
}
}
}