CameraShakes.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using UnityEngine;
  3. using Random = UnityEngine.Random;
  4. namespace HQFPSWeapons
  5. {
  6. [Serializable]
  7. public class CameraShakeSettings
  8. {
  9. public Vector3 PositionAmplitude;
  10. public Vector3 RotationAmplitude;
  11. public AnimationCurve Decay = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
  12. [Clamp(0f, 10f)]
  13. public float Duration = 2f;
  14. public float Speed = 1f;
  15. }
  16. [Serializable]
  17. public class CameraShake
  18. {
  19. public bool IsDone { get { return Time.time > m_EndTime; } }
  20. private CameraShakeSettings m_Settings;
  21. private Spring m_PositionSpring;
  22. private Spring m_RotationSpring;
  23. private float m_Speed;
  24. private float m_Scale;
  25. private float xSign, ySign, zSign;
  26. private float m_EndTime;
  27. public CameraShake(CameraShakeSettings settings, Spring positionSpring, Spring rotationSpring, float scale)
  28. {
  29. m_Settings = settings;
  30. m_PositionSpring = positionSpring;
  31. m_RotationSpring = rotationSpring;
  32. m_Speed = m_Settings.Speed;
  33. m_Scale = scale;
  34. xSign = Random.Range(0, 100) > 50 ? 1f : -1f;
  35. ySign = Random.Range(0, 100) > 50 ? 1f : -1f;
  36. zSign = Random.Range(0, 100) > 50 ? 1f : -1f;
  37. m_EndTime = Time.time + settings.Duration;
  38. }
  39. public void Update()
  40. {
  41. if (IsDone)
  42. return;
  43. UpdateShake(m_PositionSpring, m_Settings.PositionAmplitude);
  44. UpdateShake(m_RotationSpring, m_Settings.RotationAmplitude);
  45. }
  46. private void UpdateShake(Spring spring, Vector3 amplitude)
  47. {
  48. float timer = (m_EndTime - Time.time) * m_Speed;
  49. Vector3 shake = new Vector3(
  50. xSign * Mathf.Sin(timer) * amplitude.x * m_Scale,
  51. ySign * Mathf.Cos(timer) * amplitude.y * m_Scale,
  52. zSign * Mathf.Sin(timer) * amplitude.z * m_Scale
  53. );
  54. spring.AddForce(shake * m_Settings.Decay.Evaluate(1f - (m_EndTime - Time.time) / m_Settings.Duration));
  55. }
  56. }
  57. }