|
|
@@ -7,123 +7,70 @@ public class ScreenShake : MonoBehaviour
|
|
|
{
|
|
|
[Header("摄像机")]
|
|
|
public Camera mainCam;
|
|
|
- public Camera player0Cam;
|
|
|
- public Camera player1Cam;
|
|
|
- private CameraController cc;
|
|
|
|
|
|
- [Header("受重击/连续受伤时强震强闪")]
|
|
|
- public bool isHeavyShake;
|
|
|
- public float addShakeTime;
|
|
|
- public float heavyShakeLevel;
|
|
|
- public float heavyShakeFps;
|
|
|
- public float maxShineSpeed;
|
|
|
+ [System.Serializable]
|
|
|
+ public struct ShakePos
|
|
|
+ {
|
|
|
+ [Header("第几帧震动到哪儿")]
|
|
|
+ public int shakeFrame;
|
|
|
+ public Vector2 camPos;
|
|
|
+ }
|
|
|
|
|
|
- [Header("震动参数")]
|
|
|
- public float onceShakeTime; //单次震动时长
|
|
|
- public float shakeLevel; //震动幅度
|
|
|
- public float shakeFps; //震动帧率
|
|
|
- private bool isShakeCamera;
|
|
|
- private bool isRedShine;
|
|
|
- private float curShakeLevel;
|
|
|
- private float fps;
|
|
|
- private float frameTime;
|
|
|
- private float shakeDelta = 0.005f;
|
|
|
- public float shakeTime; //本次震动时长
|
|
|
+ [System.Serializable]
|
|
|
+ public struct ShakeInfo
|
|
|
+ {
|
|
|
+ [Header("震动等级,按顺序排,从0开始")]
|
|
|
+ public int level;
|
|
|
+ [Header("震动参数")]
|
|
|
+ public int onceShakeFrame; //单次震动帧数
|
|
|
+ public List<ShakePos> shakePoses;
|
|
|
+ }
|
|
|
|
|
|
- [Header("红闪参数")]
|
|
|
- public GameObject redEffect;
|
|
|
- private Image red;
|
|
|
- public float minShineSpeed;
|
|
|
- public float maxAlpha;
|
|
|
- private float shineSpeed;
|
|
|
- private int shineChange;
|
|
|
+ private bool isShakeCamera;
|
|
|
+ public List<ShakeInfo> shakeInfos;
|
|
|
|
|
|
- void OnEnable()
|
|
|
- {
|
|
|
- if (cc == null)
|
|
|
- {
|
|
|
- cc = GetComponent<CameraController>();
|
|
|
- }
|
|
|
- if (red == null)
|
|
|
- {
|
|
|
- red = redEffect.GetComponent<Image>();
|
|
|
- }
|
|
|
- redEffect.SetActive(true);
|
|
|
- isShakeCamera = true;
|
|
|
- isRedShine = true;
|
|
|
- shakeTime = onceShakeTime;
|
|
|
- curShakeLevel = shakeLevel;
|
|
|
- fps = shakeFps;
|
|
|
- frameTime = 0.03f;
|
|
|
- shineChange = 1;
|
|
|
- shineSpeed = minShineSpeed;
|
|
|
- }
|
|
|
+ //当前震动信息
|
|
|
+ private List<ShakePos> shakePoses;
|
|
|
|
|
|
- void OnDisable()
|
|
|
- {
|
|
|
- mainCam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
- player0Cam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
- player1Cam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
- isShakeCamera = false;
|
|
|
- redEffect.SetActive(false);
|
|
|
- isRedShine = false;
|
|
|
- shineSpeed = minShineSpeed;
|
|
|
- isHeavyShake = false;
|
|
|
- }
|
|
|
+ private float shakeFrame;
|
|
|
+ private int curGameFrame;
|
|
|
+ private int pastGameFrame;
|
|
|
|
|
|
- public void HeavyShakeShine()
|
|
|
+ private void SetCurShakeInfo(int level)
|
|
|
{
|
|
|
- shakeTime += addShakeTime;
|
|
|
- isHeavyShake = true;
|
|
|
- fps = heavyShakeFps;
|
|
|
- curShakeLevel = heavyShakeLevel;
|
|
|
- shineSpeed = maxShineSpeed;
|
|
|
- }
|
|
|
+ shakePoses = shakeInfos[level].shakePoses;
|
|
|
+ shakeFrame = shakeInfos[level].onceShakeFrame;
|
|
|
+ }
|
|
|
|
|
|
- // Update is called once per frame
|
|
|
- void Update()
|
|
|
- {
|
|
|
- if (isRedShine)
|
|
|
- {
|
|
|
- float a = red.color.a;
|
|
|
- if (a >= maxAlpha)
|
|
|
- {
|
|
|
- shineChange = -1;
|
|
|
- }
|
|
|
- if (a <= 0)
|
|
|
- {
|
|
|
- shineChange = 1;
|
|
|
- }
|
|
|
- a += shineChange * shineSpeed * Time.deltaTime;
|
|
|
- Color r = red.color;
|
|
|
- r.a = a;
|
|
|
- red.color = r;
|
|
|
- }
|
|
|
+ public void ShakeScreen(int level)
|
|
|
+ {
|
|
|
+ SetCurShakeInfo(level);
|
|
|
+ isShakeCamera = true;
|
|
|
+ curGameFrame = Time.frameCount;
|
|
|
+ }
|
|
|
|
|
|
+ void Update()
|
|
|
+ {
|
|
|
if (isShakeCamera)
|
|
|
{
|
|
|
- shakeTime -= Time.deltaTime;
|
|
|
- if (shakeTime <= 0)
|
|
|
+ if (pastGameFrame > shakeFrame)
|
|
|
{
|
|
|
- enabled = false;
|
|
|
+ isShakeCamera = false;
|
|
|
+ mainCam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
}
|
|
|
-
|
|
|
- frameTime += Time.deltaTime;
|
|
|
- if (frameTime > 1.0 / fps)
|
|
|
+ else
|
|
|
{
|
|
|
- frameTime = 0;
|
|
|
- mainCam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
|
|
|
- //if (cc.isSplit)
|
|
|
- //{
|
|
|
- // player0Cam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
|
|
|
- // player1Cam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
|
|
|
- //}
|
|
|
- //else
|
|
|
- //{
|
|
|
- // mainCam.rect = new Rect(shakeDelta * (-1.0f + curShakeLevel * Random.value), shakeDelta * (-1.0f + curShakeLevel * Random.value), 1.0f, 1.0f);
|
|
|
- //}
|
|
|
- }
|
|
|
+ foreach (ShakePos sp in shakePoses)
|
|
|
+ {
|
|
|
+ if (pastGameFrame >= sp.shakeFrame)
|
|
|
+ {
|
|
|
+ float x = sp.camPos.x;
|
|
|
+ float y = sp.camPos.y;
|
|
|
+ mainCam.rect = new Rect(x, y, 1.0f, 1.0f);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pastGameFrame = Time.frameCount - curGameFrame;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|