Камера от третьего лица заикается, когда я иду назад - PullRequest
2 голосов
/ 19 мая 2019

У меня есть код от третьего лица, но камера заикается, когда я иду назад! у кого-нибудь есть решение? Камера отделена от плеера, плеер вращается в соответствии с видом камеры.

PlayerController.cs

if (Input.GetKey (KeyCode.LeftShift)) {
    if(Input.GetKey(KeyCode.W) || Input.GetAxis ("Vertical") > 0) moveDirection += camera.forward;
    if(Input.GetKey(KeyCode.S) || Input.GetAxis ("Vertical") < 0) moveDirection += -camera.forward;
    if(Input.GetKey(KeyCode.A) || Input.GetAxis ("Horizontal") < 0) moveDirection += -camera.right;
    if(Input.GetKey(KeyCode.D) || Input.GetAxis ("Horizontal") > 0) moveDirection += camera.right;

    if (Input.GetAxis ("Horizontal") != 0 || Input.GetAxis ("Vertical") != 0) {
        //Multiply it by speed.
        moveDirection.Normalize ();
        moveDirection *= run;
        //Applying gravity to the controller
        moveDirection.y -= gravity * Time.deltaTime;
        //Making the character move
        controller.Move (moveDirection * Time.deltaTime);
    }
    moveDirection.y = 0f;
    if (moveDirection != Vector3.zero) {
        transform.rotation = Quaternion.RotateTowards (transform.rotation, Quaternion.LookRotation (moveDirection), rotationSpeed * Time.deltaTime);
    }
}

Camera.cs

// Update is called once per frame
void Update () {

    // We setup the rotation of the sticks here
    float inputX = Input.GetAxis ("RightStickHorizontal");
    float inputZ = Input.GetAxis ("RightStickVertical");
    mouseX = Input.GetAxis ("Mouse X");
    mouseY = Input.GetAxis ("Mouse Y");
    finalInputX = inputX + mouseX;
    finalInputZ = inputZ - mouseY;

    rotY += finalInputX * inputSensitivity * Time.deltaTime;
    rotX += finalInputZ * inputSensitivity * Time.deltaTime;

    rotX = Mathf.Clamp (rotX, -clampAngle, clampAngle);

    Quaternion localRotation = Quaternion.Euler (rotX, rotY, 0.0f);
    transform.rotation = localRotation;


void LateUpdate () {
    CameraUpdater ();
}

void CameraUpdater() {
    Transform target = CameraFollowObj.transform;
    // set the target object to follow

    //move towards the game object that is the target
    float step = CameraMoveSpeed * Time.fixedDeltaTime;
    transform.position = Vector3.MoveTowards (transform.position, CameraFollowObj.transform.position, step);
}

1 Ответ

2 голосов
/ 19 мая 2019

По моему опыту, когда у вас гладкая камера, которая заикается, это потому, что камера - как только она набрала скорость - движется быстрее, чем объект, за которым она следует:

Проблема

  1. Объект движется
  2. Камера начинает медленно двигаться к объекту
  3. Она догоняет и останавливается
  4. Камера начинает медленно двигаться к объекту
  5. Повтор 2-4;заикание

Решение

Простое; отрегулируйте переменные скорости камеры , чтобы убедиться, что она никогда не полностью догоняет, когда объект движется, а скорее остается позади, чтобы не останавливаться каждые несколько кадров.



Бонусные материалы для чтения

Другие источники часто объясняют, что их решение состоит в том, чтобы неправильно поместить код в FixedUpdate, чтобы чудесным образом избавиться от заикания.Иногда получение правильного поведения от этого происходит из-за ряда вещей:

  • Обновление запускает каждое обновление кадра, поэтому временной шаг (Time.deltaTime) здесь зависит от машины, но на моей машине это будетв среднем каждые 0,007 секунды.
  • FixedUpdate запускается с фиксированным временным шагом, стандартное значение равно 0,002, но его можно изменить в настройках.
  • Код: float step = CameraMoveSpeed * Time.deltaTime; Давайте предположим, что CameraMoveSpeed ​​равен 1, ради простой математики.

Итак, с этими числами мы можем понять, что помещение кода в Update даетследующий результат

Обновление

Каждые 0,007 секунды мы обновляем тиканье камеры с помощью CameraMoveSpeed ​​* 0,007

FixedUpdate

Каждые 0,02 секунды мы обновляем тик камеры с помощью CameraMoveSpeed ​​* 0,007

Результат

Они перемещаются на одну и ту же длину каждый тик, но тики реже встречаются в FixedUpdate, что приводит к более медленному сглаживанию камеры и, таким образом, «решает» проблему, описанную как ответ на этот пост, в некотором смысле,настраивая переменные скорости камеры, чтобы получить более медленное следование за камерой, но вместо того, чтобы настраивать переменные, вы перенесли свой код в обновление физики вместо обновления кадра, и вы решили проблему только случайно, не понимаяAUSE.

...