ShakeMotionAdapters.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Unity.Jobs;
  2. using UnityEngine;
  3. using LitMotion;
  4. using LitMotion.Adapters;
  5. [assembly: RegisterGenericJobType(typeof(MotionUpdateJob<float, ShakeOptions, FloatShakeMotionAdapter>))]
  6. [assembly: RegisterGenericJobType(typeof(MotionUpdateJob<Vector2, ShakeOptions, Vector2ShakeMotionAdapter>))]
  7. [assembly: RegisterGenericJobType(typeof(MotionUpdateJob<Vector3, ShakeOptions, Vector3ShakeMotionAdapter>))]
  8. namespace LitMotion.Adapters
  9. {
  10. // Note: Shake motion uses startValue as offset and endValue as vibration strength.
  11. public readonly struct FloatShakeMotionAdapter : IMotionAdapter<float, ShakeOptions>
  12. {
  13. public float Evaluate(ref float startValue, ref float endValue, ref ShakeOptions options, in MotionEvaluationContext context)
  14. {
  15. VibrationHelper.EvaluateStrength(endValue, options.Frequency, options.DampingRatio, context.Progress, out var s);
  16. float multipliar;
  17. if (options.RandomState.state == 0)
  18. {
  19. multipliar = SharedRandom.Random.NextFloat(-1f, 1f);
  20. }
  21. else
  22. {
  23. multipliar = options.RandomState.NextFloat(-1f, 1f);
  24. }
  25. return startValue + s * multipliar;
  26. }
  27. }
  28. public readonly struct Vector2ShakeMotionAdapter : IMotionAdapter<Vector2, ShakeOptions>
  29. {
  30. public Vector2 Evaluate(ref Vector2 startValue, ref Vector2 endValue, ref ShakeOptions options, in MotionEvaluationContext context)
  31. {
  32. VibrationHelper.EvaluateStrength(endValue, options.Frequency, options.DampingRatio, context.Progress, out var s);
  33. Vector2 multipliar;
  34. if (options.RandomState.state == 0)
  35. {
  36. multipliar = new Vector2(SharedRandom.Random.NextFloat(-1f, 1f), SharedRandom.Random.NextFloat(-1f, 1f));
  37. }
  38. else
  39. {
  40. multipliar = new Vector2(options.RandomState.NextFloat(-1f, 1f), options.RandomState.NextFloat(-1f, 1f));
  41. }
  42. return startValue + new Vector2(s.x * multipliar.x, s.y * multipliar.y);
  43. }
  44. }
  45. public readonly struct Vector3ShakeMotionAdapter : IMotionAdapter<Vector3, ShakeOptions>
  46. {
  47. public Vector3 Evaluate(ref Vector3 startValue, ref Vector3 endValue, ref ShakeOptions options, in MotionEvaluationContext context)
  48. {
  49. VibrationHelper.EvaluateStrength(endValue, options.Frequency, options.DampingRatio, context.Progress, out var s);
  50. Vector3 multipliar;
  51. if (options.RandomState.state == 0)
  52. {
  53. multipliar = new Vector3(SharedRandom.Random.NextFloat(-1f, 1f), SharedRandom.Random.NextFloat(-1f, 1f), SharedRandom.Random.NextFloat(-1f, 1f));
  54. }
  55. else
  56. {
  57. multipliar = new Vector3(options.RandomState.NextFloat(-1f, 1f), options.RandomState.NextFloat(-1f, 1f), options.RandomState.NextFloat(-1f, 1f));
  58. }
  59. return startValue + new Vector3(s.x * multipliar.x, s.y * multipliar.y, s.z * multipliar.z);
  60. }
  61. }
  62. }