分享

Unity中手动处理摄像机的抖动问题

 尹亮亮 2015-11-26
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;
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多