AnimationDriver.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace ChivaXR
  6. {
  7. /// <summary>
  8. /// 动画执行顺序
  9. /// </summary>
  10. public enum AnimationSequence
  11. {
  12. synchronization, //同步执行下一步
  13. waitFinished //等待当前动画完成,执行一下状态
  14. }
  15. public enum Animation_State
  16. {
  17. initState,
  18. finishedState
  19. }
  20. public interface IAniState
  21. {
  22. void InitState(); //初始化状态
  23. void FinishedState(); //结束状态
  24. }
  25. public class AnimationDriver
  26. {
  27. /// <summary>
  28. /// 播放动画组
  29. /// </summary>
  30. /// <param name="aniDT_Bases"></param>
  31. /// <param name="finishedCallBack"></param>
  32. public static void PlayAniDrivers(AnimationDriverBase[] aniDrivers, Action finishedCallBack = null)
  33. {
  34. AnimationCoroutine.Instance.StartCoroutine(PlayAniDriversLinner(aniDrivers, finishedCallBack));
  35. }
  36. public static void StopAllAnimation()
  37. {
  38. AnimationCoroutine.Instance.StopAllCoroutines();
  39. }
  40. /// <summary>
  41. /// 线性播放动画
  42. /// </summary>
  43. /// <param name="aniDrivers"></param>
  44. /// <param name="finishedCallBack"></param>
  45. /// <returns></returns>
  46. private static IEnumerator PlayAniDriversLinner(AnimationDriverBase[] aniDrivers, Action finishedCallBack)
  47. {
  48. //等待一帧,防止部分冲突
  49. yield return new WaitForEndOfFrame();
  50. for (int i = 0; i < aniDrivers.Length; i++)
  51. {
  52. bool finishedCurrentAniDriver = false;
  53. switch (aniDrivers[i].animationSequence)
  54. {
  55. case AnimationSequence.synchronization:
  56. aniDrivers[i].StartPlay();
  57. finishedCurrentAniDriver = true;
  58. break;
  59. case AnimationSequence.waitFinished:
  60. aniDrivers[i].StartPlay(() => finishedCurrentAniDriver = true);
  61. break;
  62. }
  63. while (!finishedCurrentAniDriver)
  64. {
  65. yield return new WaitForEndOfFrame();
  66. }
  67. }
  68. finishedCallBack?.Invoke();
  69. }
  70. /// <summary>
  71. /// 设置AniDrivers状态组
  72. /// </summary>
  73. /// <param name="aniDrivers"></param>
  74. /// <param name="aniState"></param>
  75. public static void SetAniDriversState(AnimationDriverBase[] aniDrivers, Animation_State aniState)
  76. {
  77. switch (aniState)
  78. {
  79. case Animation_State.initState:
  80. for (int i = aniDrivers.Length - 1; i >= 0; i--)
  81. {
  82. aniDrivers[i].InitState();
  83. }
  84. break;
  85. case Animation_State.finishedState:
  86. for (int i = 0; i < aniDrivers.Length; i++)
  87. {
  88. aniDrivers[i].FinishedState();
  89. }
  90. break;
  91. }
  92. }
  93. }
  94. }