AniDriver_IntervalAnimation.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using ChivaXR;
  5. using Sirenix.OdinInspector;
  6. using System;
  7. using System.Linq;
  8. public class AniDriver_IntervalAnimation : AnimationDriverBase
  9. {
  10. [SerializeField]
  11. private Animation m_Animation;
  12. [ValueDropdown("GetAllAnimationNames")]
  13. [SerializeField]
  14. private string m_AniName;
  15. [LabelWidth(50)]
  16. [LabelText("起始帧")]
  17. [SerializeField]
  18. private int m_StartFrame;
  19. [LabelWidth(50)]
  20. [LabelText("结束帧")]
  21. [SerializeField]
  22. private int m_EndFrame;
  23. [LabelWidth(100)]
  24. [LabelText("动画帧率")]
  25. [SerializeField]
  26. private int m_AniFPS = 30;
  27. [LabelWidth(100)]
  28. [LabelText("播放速度")]
  29. [SerializeField]
  30. private float m_Speed = 1;
  31. private AnimationState m_AniState;
  32. /// <summary>
  33. /// 当前帧数
  34. /// </summary>
  35. private int m_CurrentFrame = 0;
  36. public override void FinishedState()
  37. {
  38. }
  39. public override void InitState()
  40. {
  41. if (m_Animation == null || string.IsNullOrEmpty(m_AniName))
  42. {
  43. return;
  44. }
  45. m_AniState = m_Animation[m_AniName];
  46. }
  47. public override void StartPlay(Action finishedCallBack = null)
  48. {
  49. StartAniCoroutine(PlayAnimation(finishedCallBack));
  50. }
  51. /// <summary>
  52. /// 获取动画名称信息
  53. /// </summary>
  54. /// <returns></returns>
  55. private IEnumerable GetAllAnimationNames()
  56. {
  57. return AnimationManager.Instance.animationDatas.Select(value => new ValueDropdownItem(value.AniDataName, value.AniDataName));
  58. }
  59. private IEnumerator PlayAnimation(Action finishedCallBack)
  60. {
  61. yield return new WaitForSeconds(m_StartFrame / m_AniFPS);
  62. while (m_CurrentFrame < m_EndFrame)
  63. {
  64. ChangeAniDataProcess(m_CurrentFrame / m_AniFPS);
  65. m_CurrentFrame++;
  66. }
  67. finishedCallBack?.Invoke();
  68. }
  69. /// <summary>
  70. /// 改变动画进度
  71. /// </summary>
  72. /// <param name="_value"></param>
  73. private void ChangeAniDataProcess(float _value)
  74. {
  75. if (m_Animation == null || m_AniState == null)
  76. {
  77. return;
  78. }
  79. m_AniState.enabled = true;
  80. m_AniState.speed = 0;
  81. m_AniState.weight = 1;
  82. m_AniState.normalizedTime = _value;
  83. m_Animation.Sample();
  84. m_AniState.enabled = false;
  85. }
  86. }