ScreenShake.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class ScreenShake : MonoBehaviour
  6. {
  7. [Header("摄像机")]
  8. public Camera mainCam;
  9. public Camera player0Cam;
  10. public Camera player1Cam;
  11. private CameraController cc;
  12. [Header("受重击/连续受伤时强震强闪")]
  13. public bool isHeavyShake;
  14. public float addShakeTime;
  15. public float heavyShakeLevel;
  16. public float heavyShakeFps;
  17. public float maxShineSpeed;
  18. [Header("震动参数")]
  19. public float onceShakeTime; //单次震动时长
  20. public float shakeLevel; //震动幅度
  21. public float shakeFps; //震动帧率
  22. private bool isShakeCamera;
  23. private bool isRedShine;
  24. private float curShakeLevel;
  25. private float fps;
  26. private float frameTime;
  27. private float shakeDelta = 0.005f;
  28. public float shakeTime; //本次震动时长
  29. [Header("红闪参数")]
  30. public GameObject redEffect;
  31. private Image red;
  32. public float minShineSpeed;
  33. public float maxAlpha;
  34. private float shineSpeed;
  35. private int shineChange;
  36. void OnEnable()
  37. {
  38. if (cc == null)
  39. {
  40. cc = GetComponent<CameraController>();
  41. }
  42. if (red == null)
  43. {
  44. red = redEffect.GetComponent<Image>();
  45. }
  46. redEffect.SetActive(true);
  47. isShakeCamera = true;
  48. isRedShine = true;
  49. shakeTime = onceShakeTime;
  50. curShakeLevel = shakeLevel;
  51. fps = shakeFps;
  52. frameTime = 0.03f;
  53. shineChange = 1;
  54. shineSpeed = minShineSpeed;
  55. }
  56. void OnDisable()
  57. {
  58. mainCam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
  59. player0Cam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
  60. player1Cam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
  61. isShakeCamera = false;
  62. redEffect.SetActive(false);
  63. isRedShine = false;
  64. shineSpeed = minShineSpeed;
  65. isHeavyShake = false;
  66. }
  67. public void HeavyShakeShine()
  68. {
  69. shakeTime += addShakeTime;
  70. isHeavyShake = true;
  71. fps = heavyShakeFps;
  72. curShakeLevel = heavyShakeLevel;
  73. shineSpeed = maxShineSpeed;
  74. }
  75. // Update is called once per frame
  76. void Update()
  77. {
  78. if (isRedShine)
  79. {
  80. float a = red.color.a;
  81. if (a >= maxAlpha)
  82. {
  83. shineChange = -1;
  84. }
  85. if (a <= 0)
  86. {
  87. shineChange = 1;
  88. }
  89. a += shineChange * shineSpeed * Time.deltaTime;
  90. Color r = red.color;
  91. r.a = a;
  92. red.color = r;
  93. }
  94. if (isShakeCamera)
  95. {
  96. shakeTime -= Time.deltaTime;
  97. if (shakeTime <= 0)
  98. {
  99. enabled = false;
  100. }
  101. frameTime += Time.deltaTime;
  102. if (frameTime > 1.0 / fps)
  103. {
  104. frameTime = 0;
  105. mainCam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
  106. //if (cc.isSplit)
  107. //{
  108. // player0Cam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
  109. // player1Cam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
  110. //}
  111. //else
  112. //{
  113. // mainCam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
  114. //}
  115. }
  116. }
  117. }
  118. }