子弹发射屏幕晃动

那个代码是正交投影的吧?用在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();
    }

}

posted @ 2016-09-07 17:34  Fei非非  阅读(232)  评论(0编辑  收藏  举报