那个代码是正交投影的吧?用在2d的游戏里面的,2d的游戏里面你只在摄像机方向改变摄像机的位置不会有效果。
如果是透视投影的话,就改变下位置就行,效果应该还不错。举个例子,比如你知道子弹打中你的时候子弹的飞行方向,然后你要像那个方向震一下。
public class CameraShake : MonoBehaviour {
float m_fShakeTotalTime = 0.0f;
float m_fShakeTime = 0.0f;
Vector3 m_vShakeDir = new Vector3(0.0f, 0.0f, 0.0f);
void Start () {
m_fShakeTime = 0.0f;
}
public void ShakeMe(float fTime, Vector3 vDir)
{
m_fShakeTotalTime = fTime;
m_fShakeTime = fTime; //设置震动一下的时间
m_vShakeDir = vDir;
}
public void Update() {
Vector3 vShakeOffset = new Vector3(0.0f, 0.0f, 0.0f);
if (m_fShakeTime > 0.0f ;; m_fShakeTotalTime >= m_fShakeTime ) {
m_fShakeTime -= Time.deltaTime;
float fRate = m_fShakeTime / m_fShakeTotalTime; //这个fRate在0到1之间
//根据我的测试,震动一下快速震过去然后慢慢恢复效果比较好。
if (fRate > 0) {
float fShakeOffset = Mathf.Cos(
(1.0f - fRate) * (1.0f - fRate) * Mathf.PI);
//当fRate为0和1时,fShakeOffset 为0, 当fRate为0.3左右的时候,fShakeOffset为1达到最大。
vShakeOffset = m_vShakeDir * fShakeOffset ;//这个是这次震动应当改变摄像机的位置多少,可不要直接加到摄像机的transform.position中。
//比如你有一个变量,叫m_vCameraPosShouldBe,这个变量可能是通过玩家的位置算出来的摄像机的位置。你加到这里面。如果你的摄像机的位置是固定的,应该在ShakeMe函数中保留不震动时摄像机原本的位置,加到这个位置里在赋给摄像机的transform.position
}
}
}
}
这个脚本没测试过,呵呵。不过意思应该说明白啦。
再加上一些小小的转动。或者让摄像机快速来回晃动几下(这个脚本只震一下),应该会有不错的效果。(根据测试,附近有炸弹爆炸造成的晃动,至少要晃2到3下感觉才给力)
开枪时候的后坐力也可以用震动,效果不错的。然后还可以让准心稍稍随机的飘离(改变摄像机的方向)。
手机上给爆炸晃动摄像机的效果的同时还可以让手机也震一下。
public class CameraShake : MonoBehaviour {
Matrix4x4 originalProjection;
float timer;
void Start () {
originalProjection = camera.projectionMatrix;
}
public IEnumerator Shake(float gap)
{
timer = Time.time;
while(Time.time - timer <= gap)
{
Matrix4x4 p = originalProjection;
p.m01 += Mathf.Sin(Time.time * 120F) * 0.04F;
p.m10 += Mathf.Sin(Time.time * 150F) * 0.04F;
camera.projectionMatrix = p;
yield return 0;
}
camera.ResetProjectionMatrix();
}
}