ScreenShake.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. public class ScreenShake : MonoBehaviour
  7. {
  8. [Header("摄像机")]
  9. public Camera mainCam;
  10. [Header("预览")]
  11. public int previewLevel;
  12. public bool isPreview;
  13. [System.Serializable]
  14. public struct ShakePos
  15. {
  16. [Header("第几帧震动到哪儿")]
  17. public int shakeFrame;
  18. public Vector2 camPos;
  19. }
  20. [System.Serializable]
  21. public struct ShakeInfo
  22. {
  23. [Header("震动等级,按顺序排,从0开始")]
  24. public int level;
  25. [Header("震动参数")]
  26. public int onceShakeFrame; //单次震动帧数
  27. public List<ShakePos> shakePoses;
  28. }
  29. [Header("震动预设")]
  30. public List<ShakeInfo> shakeInfos;
  31. private bool isShakeCamera;
  32. //当前震动信息
  33. private List<ShakePos> shakePoses;
  34. private float shakeFrame;
  35. private float pastFrame;
  36. private void SetCurShakeInfo(int level)
  37. {
  38. shakePoses = shakeInfos[level].shakePoses;
  39. shakeFrame = shakeInfos[level].onceShakeFrame;
  40. }
  41. public void ShakeScreen(int level)
  42. {
  43. SetCurShakeInfo(level);
  44. isShakeCamera = true;
  45. }
  46. void Update()
  47. {
  48. if (isPreview)
  49. {
  50. isPreview = false;
  51. SetCurShakeInfo(previewLevel);
  52. isShakeCamera = true;
  53. }
  54. if (isShakeCamera)
  55. {
  56. if (pastFrame > shakeFrame)
  57. {
  58. isShakeCamera = false;
  59. transform.position = Vector2.zero;
  60. pastFrame = 0;
  61. }
  62. else
  63. {
  64. foreach (ShakePos sp in shakePoses)
  65. {
  66. if (pastFrame == sp.shakeFrame)
  67. {
  68. float x = sp.camPos.x;
  69. float y = sp.camPos.y;
  70. transform.position = new Vector2(x, y);
  71. }
  72. }
  73. }
  74. pastFrame += 1;
  75. }
  76. }
  77. }