using UnityEngine; using System.Collections; public class SXHCameraShake : MonoBehaviour { public enum CameraShakeMode { Horizontal = 1, vertical = 2, Random = 3, } public static SXHCameraShake Instance; private int shakeCount; private int beleftCount; private float startTime; private float perStartTime; private float shakeTime; private float perShakeTime; private float shakeIntensity; private CameraShakeMode shakeMode; private Vector3 startPoint; private Vector3 nextPoint; private bool UpLeft = false; void Awake () { Instance = this; this.enabled = false; } void Update () { if (Time.time - startTime > shakeTime) //震屏结束 { EndShake (); } else { if(Time.time - perStartTime > perShakeTime)//每下震动结束时,需要计算下一次的目标点 { startPoint = nextPoint; if(Time.time - startTime > shakeTime - perShakeTime * 0.5f)//最后一下震动回归原点 { nextPoint = Vector3.zero; perShakeTime *= 0.5f; }else { beleftCount--; float power = (float)beleftCount / shakeCount * shakeIntensity; switch(shakeMode) { case CameraShakeMode.Horizontal: if(UpLeft) { nextPoint = Vector3.left * power; }else { nextPoint = Vector3.right * power; } break; case CameraShakeMode.vertical: if(UpLeft) { nextPoint = Vector3.up * power; }else { nextPoint = Vector3.down * power; } break; case CameraShakeMode.Random: nextPoint = new Vector3(Random.Range(-1.0f,1.0f),Random.Range(-1.0f,1.0f),0.0f).normalized * shakeIntensity; break; } UpLeft = !UpLeft; } perStartTime = Time.time; transform.localPosition = startPoint; }else//计算震屏插值位置 { float t = (Time.time - perStartTime)/perShakeTime; transform.localPosition = Vector3.Lerp(startPoint,nextPoint,t); } } } public void Shake(int count,float per,float power,CameraShakeMode mode) { shakeCount = count; beleftCount = count; shakeTime = per * count; perShakeTime = per; shakeIntensity = power; shakeMode = mode; this.enabled = true; startTime = Time.time; perStartTime = Time.time - per * 0.5f; transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; UpLeft = true; switch (mode) { case CameraShakeMode.Horizontal: startPoint = Vector3.left * power; nextPoint = Vector3.right * power; break; case CameraShakeMode.vertical: startPoint = Vector3.up * power; nextPoint = Vector3.down * power; break; case CameraShakeMode.Random: startPoint = new Vector3(Random.Range(-1.0f,1.0f),Random.Range(-1.0f,1.0f),0.0f).normalized * power; nextPoint = new Vector3(Random.Range(-1.0f,1.0f),Random.Range(-1.0f,1.0f),0.0f).normalized * power; break; } } private void EndShake() { this.enabled = false; transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; } } |
|