团结:相机穿过地形

时间:2013-11-21 08:30:04

标签: camera unity3d terrain

问题是:

我创建了地形,我需要使用相机飞越地形。我添加到Camera“Mouse Look”脚本,RigidBody:usegravity - unchecked,我在Update方法中添加了我的代码:

    float vert = Input.GetAxis("Vertical");
    float hor = Input.GetAxis("Horizontal");

    if (vert != 0)
    {
        if (!Physics.Raycast(this.transform.position, this.transform.forward, 5))
        {
            transform.Translate(Vector3.forward * flySpeed * vert);
        }
        else
        {
            transform.Translate(Vector3.up * flySpeed * vert);
        }
    }

    if (hor != 0)
    {   

        if (!Physics.Raycast(this.transform.position, this.transform.forward, 5))
        {
            transform.Translate(Vector3.right * flySpeed * hor);
        }
        else
        {
            transform.Translate(Vector3.up * flySpeed* hor);
        }
    }

    if (Input.GetKey(KeyCode.E))
    {
        transform.Translate(Vector3.up * flySpeed);            
    }
    else if (Input.GetKey(KeyCode.Q))
    {
        Vector3 v = Vector3.down * flySpeed;

        if (!Physics.Raycast(this.transform.position, this.transform.forward, 5))
        {
            transform.Translate(v);
        }           
    }

但有时候我会走下去 - Q - 相机经过地形。为什么? 如果你在相机向前移动尽可能低的地形并且相机不会通过它移动它也会看起来很丑 - 它开始跳跃。还为什么?

3 个答案:

答案 0 :(得分:0)

确保地形上有Terrain Collider

答案 1 :(得分:0)

除了S.Richmonds的回答,您还可以在相机中添加角色控制器或其他类似的对撞机组件对象。

在统一问题网络中查看此答案: http://answers.unity3d.com/questions/45763/getting-camera-to-not-see-under-the-ground.html

答案 2 :(得分:0)

单个行为中的Update()方法会在每个fram中被调用一次。由于调用更新的速率取决于帧速率,因此在Update()中将对象移动一个常量值会导致运动不一致。这可以通过将恒定速度乘以Time.deltaTime来校正,该时间是自上一帧渲染以来的秒数。除非将flySpeed设置得太高(每个帧的位置变化大于对撞机的大小),否则这将解决这个问题。另外,如上所述,使用没有刚体的CharacterController将更适合这种情况。刚体适用于主要由物理控制的对象,而CharacterController适用于由脚本控制的对象。