NumberKeyframeGroup.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Runtime.CompilerServices;
  5. using UnityEngine;
  6. namespace Funly.SkyStudio
  7. {
  8. [Serializable]
  9. public class NumberKeyframeGroup : KeyframeGroup<NumberKeyframe>
  10. {
  11. public float minValue;
  12. public float maxValue;
  13. public NumberKeyframeGroup(string name, float min, float max) : base(name)
  14. {
  15. minValue = min;
  16. maxValue = max;
  17. }
  18. public NumberKeyframeGroup(string name, float min, float max, NumberKeyframe frame) : base(name)
  19. {
  20. minValue = min;
  21. maxValue = max;
  22. AddKeyFrame(frame);
  23. }
  24. public float GetFirstValue()
  25. {
  26. return GetKeyframe(0).value;
  27. }
  28. // Get a percent for a given value in this range.
  29. public float ValueToPercent(float value)
  30. {
  31. return Mathf.Abs((value - minValue) / (maxValue - minValue));
  32. }
  33. // Get a normalized 0-1 value for the value at a given time position.
  34. public float ValuePercentAtTime(float time)
  35. {
  36. return ValueToPercent(NumericValueAtTime(time));
  37. }
  38. // Convert percent to a value.
  39. public float PercentToValue(float percent)
  40. {
  41. float value = minValue + ((maxValue - minValue) * percent);
  42. return Mathf.Clamp(value, minValue, maxValue);
  43. }
  44. // Get the value for a point in time
  45. public float NumericValueAtTime(float time)
  46. {
  47. time = time - (int)time;
  48. if (keyframes.Count == 0)
  49. {
  50. Debug.LogError("Keyframe group has no keyframes: " + name);
  51. return minValue;
  52. }
  53. if (keyframes.Count == 1)
  54. {
  55. return GetKeyframe(0).value;
  56. }
  57. int beforeKeyIndex, afterKeyIndex;
  58. GetSurroundingKeyFrames(time, out beforeKeyIndex, out afterKeyIndex);
  59. NumberKeyframe before = GetKeyframe(beforeKeyIndex);
  60. NumberKeyframe after = GetKeyframe(afterKeyIndex);
  61. return InterpolateFloat(before.interpolationCurve, before.interpolationDirection, time,
  62. before.time, after.time, before.value, after.value, minValue, maxValue);
  63. }
  64. }
  65. }