Unity 3D — Как использовать LateUpdate в скрипте Mouselook?

#c# #unity3d

#c# #unity3d

Вопрос:

Моя сборка страдает от ужасного заикания / задержки при перемещении объектов. На этом форуме мне посоветовали установить для жесткого тела значение «Интерполировать» и использовать LateUpdate в моем скрипте.

Проблема в том…Я не знаю, как? Когда я пытаюсь, я получаю ошибку компилятора или просто не могу переместить cam.

Я нашел другой бесплатный скрипт FPS, который работал, используя camera follow lag, но я тоже не могу понять, как использовать этот код.

Как я могу использовать LateUpdate в моем текущем скрипте?

 void Start() {
    Cursor.visible = false;
    Cursor.lockState = CursorLockMode.Locked;
}

void Update() {
    float x = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
    float y = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime * -1f;

    transform.Rotate(0f, x, 0f);

    headRotation  = y;
    headRotation = Mathf.Clamp(headRotation, -headRotationLimit, headRotationLimit);
    cam.localEulerAngles = new Vector3(headRotation, 0f, 0f);
}
 

Комментарии:

1. docs.unity3d.com/ScriptReference/MonoBehaviour . LateUpdate.html

2. Я предполагаю, что вы имеете в виду LateUpdate?

3. Да, сэр, но когда я меняю обновление на LateUpdate, камера по-прежнему не вращается. (без заикания). У меня более 500 кадров в секунду.

4. Lerp вращение камеры таким образом сглажено, но вы правы, желая сделать это в LateUpdate .

5. Как это будет выглядеть в коде?

Ответ №1:

Вот отредактированная версия моего метода поворота проигрывателя FPS, используйте это как руководство для того, как это можно сделать, и измените его для своих нужд, включая несколько методов, которые я использую, чтобы ограничить, насколько далеко может поворачиваться камера (игрок может смотреть вверх и вниз)

 // Set the Camera in the inspector so that it can be rotated
public Camera camera;


// Rotation variables for both the player and camera
private Quaternion _playerRotation;
private Quaternion _cameraRotation;

// The speed you want to be able to look
private float _lookSpeed = 3f;

// Set the initial rotations to the rotation variables
private void Awake()
{
    _playerRotation = transform.localRotation;
    _cameraRotation = camera.transform.localRotation;
}

// Method to be called from LateUpdate
private void UpdateRotation()
{
    Vector2 input = new Vector2(
        Input.GetAxis("Mouse X"),
        Input.GetAxis("Mouse Y")
    );

    if (input != Vector2.zero)
    {
        _playerRotation *= Quaternion.Euler(0f, _lookSpeed * input.x, 0f);
        _cameraRotation *= Quaternion.Euler(_lookSpeed * -input.y, 0f, 0f);

        _cameraRotation = ClampRotationAroundXAxis(_cameraRotation, -50f , 75f);
    }

    transform.localRotation = Quaternion.Slerp(transform.localRotation, _playerRotation, 10f * Time.deltaTime);
    camera.transform.localRotation = Quaternion.Slerp(camera.transform.localRotation, _cameraRotation, 10f * Time.deltaTime);
}


// A couple of rotation methods 
// I suggest making these extensions for use anywhere in the game and for all rotations
private Quaternion ClampRotationAroundXAxis(Quaternion q, float minX = 0f, float maxX = 0f)
{
    if (q.w != 0f)
    {
        q.x /= q.w;
        q.y /= q.w;
        q.z /= q.w;
        q.w = 1f;
    }

    q.y = 0f;
    q.z = 0f;

    if (minX != 0f || maxX != 0f)
    {
        q = ClampRotationXAxis(q, minX, maxX);
    }

    return q;
}

private Quaternion ClampRotationXAxis(Quaternion q, float min, float max)
{

    if (q.w != 0f)
    {
        q.x /= q.w;
        q.y /= q.w;
        q.z /= q.w;
        q.w = 1f;
    }

    float angle = 2f * Mathf.Rad2Deg * Mathf.Atan(q.x);

    angle = Mathf.Clamp(angle, min, max);

    q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angle);

    return q;
}
 

Комментарии:

1. Я получаю ошибку компилятора с вашим скриптом. 63,19 «Quaternion не содержит определения для ClampRotationXAxis и не может быть найден доступный метод расширения ClampRotationXAxis, принимающий первый аргумент типа Quaternion».

2. Извините, я не полностью удалил способ, которым я использовал изменение ClampRotationXAxis() расширения q.ClampRotationXAxis(minX, maxX); на ClampRotationXAxis(q, minX, maxX);

3. Спасибо за ваше время. Скрипт запускается сейчас, но я не могу переместить камеру. Я пробовал подключаться как к самой камере, так и к проигрывателю. Возможно, я что-то упускаю?

4. Эти методы будут использоваться в скрипте, который вы используете для остальных элементов управления проигрывателя на проигрывателе, и добавили ли вы вызов метода rotation в LateUpdate ?

5. Хорошо, я попробую и поиграю с этим. Мои навыки программирования довольно просты. Спасибо.