2013-11-21 2 views
2

Задача состоит в том, что:Единство: камера падает через рельеф

Я создал местность, и мне нужно пролететь через территорию с помощью камеры. Я добавил к камере «Mouse Look» сценарий, Rigidbody: usegravity - непроверенный и я добавил свой код в методе 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 - камера проходит через местность. Зачем? Также выглядит уродливым, если вы двигаетесь с камерой вперед настолько низко, насколько возможно на местности, и камера не проваливается через нее - она ​​начинает прыгать. И почему?

ответ

0

метод Update() в monobehavior вызывается один раз Фрам. Поскольку скорость, вызванная обновлением, зависит от частоты кадров, перемещение объекта по постоянному значению в Update() может привести к несогласованному движению. Это можно скорректировать путем умножения постоянной скорости на Time.deltaTime, которая является временем в секундах с момента визуализации последнего кадра. Это исправит провал, если значение flySpeed ​​слишком велико (где изменение положения каждого кадра больше размера коллайдера). Кроме того, как было предложено выше, использование CharacterController без жесткого тела лучше подходит для этой ситуации. Жесткие тела предназначены для объектов, которые в основном контролируются физикой, а CharacterController - для объектов, контролируемых скриптами.

Смежные вопросы