Advertisement
talmud

Camera shake

Dec 14th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class CameraShake : MonoBehaviour {
  6. public float speed = 1f;
  7. public float minAmplitude = 0.1f;
  8. public float maxAmplitude = 1.0f;
  9. public float minDelay = 0.01f;
  10. public float maxDelay = 0.1f;
  11. public int minShakes = 10;
  12. public int maxShakes = 20;
  13.  
  14. Vector2 currentFocus;
  15. List<ShakeParams> shakes;
  16. //public bool shaking;
  17.  
  18.  
  19.  
  20.  
  21. static CameraShake _instance;
  22. // Use this for initialization
  23. void Awake() {
  24. _instance = this;
  25. }
  26. //IEnumerator Start()
  27. //{
  28. // // example usage
  29. // CameraShake.GenerateShakes();
  30. // yield return new WaitForSeconds(5f);
  31. // CameraShake.Shake();
  32. //}
  33. void Reset()
  34. {
  35. speed = 1f;
  36. minAmplitude = 0.1f;
  37. maxAmplitude = 1.0f;
  38. minDelay = 0.01f;
  39. maxDelay = 0.1f;
  40. minShakes = 10;
  41. maxShakes = 20;
  42. }
  43.  
  44. // Update is called once per frame
  45. void Update() {
  46. transform.localPosition = Vector3.Lerp(transform.localPosition, currentFocus, Time.deltaTime * speed);
  47. }
  48.  
  49. public static void GenerateShakes()
  50. {
  51. _instance.DoGenerateShakes();
  52. }
  53.  
  54. void DoGenerateShakes()
  55. {
  56. shakes = new List<ShakeParams>();
  57. var total = Random.Range(minShakes, maxShakes);
  58. for (int i = 0; i < total; i++)
  59. {
  60. shakes.Add(new ShakeParams() {
  61. amplitude = Random.Range(minAmplitude, maxAmplitude),
  62. timeToMove = Random.Range(minDelay, maxDelay)
  63. });
  64. }
  65. }
  66.  
  67. public static void Shake()
  68. {
  69. if (_instance.shake != null)
  70. {
  71. _instance.StopCoroutine(_instance.shake);
  72. }
  73. _instance.shake = _instance.DoShake();
  74. _instance.StartCoroutine(_instance.shake);
  75. }
  76. IEnumerator shake;
  77. IEnumerator DoShake()
  78. {
  79. //shaking = true;
  80. foreach (var shake in shakes)
  81. {
  82. currentFocus = Random.insideUnitCircle * shake.amplitude;
  83. yield return new WaitForSeconds(shake.timeToMove);
  84. }
  85. //shaking = false;
  86. currentFocus = new Vector2();
  87. }
  88.  
  89. [System.Serializable]
  90. public struct ShakeParams
  91. {
  92. public float amplitude;
  93. public float timeToMove;
  94.  
  95. }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement