using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.UI; public class ScreenShake : MonoBehaviour { [Header("摄像机")] public Camera mainCam; [Header("预览")] public int previewLevel; public bool isPreview; [System.Serializable] public struct ShakePos { [Header("第几帧震动到哪儿")] public int shakeFrame; public Vector2 camPos; } [System.Serializable] public struct ShakeInfo { [Header("震动等级,按顺序排,从0开始")] public int level; [Header("震动参数")] public int onceShakeFrame; //单次震动帧数 public List shakePoses; } [Header("震动预设")] public List shakeInfos; private bool isShakeCamera; //当前震动信息 private List shakePoses; private float shakeFrame; private float pastFrame; private void SetCurShakeInfo(int level) { shakePoses = shakeInfos[level].shakePoses; shakeFrame = shakeInfos[level].onceShakeFrame; } public void ShakeScreen(int level) { SetCurShakeInfo(level); isShakeCamera = true; } void Update() { if (isPreview) { isPreview = false; SetCurShakeInfo(previewLevel); isShakeCamera = true; } if (isShakeCamera) { if (pastFrame > shakeFrame) { isShakeCamera = false; transform.position = Vector2.zero; pastFrame = 0; } else { foreach (ShakePos sp in shakePoses) { if (pastFrame == sp.shakeFrame) { float x = sp.camPos.x; float y = sp.camPos.y; transform.position = new Vector2(x, y); } } } pastFrame += 1; } } }