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