Гладкая точная камера Unity, движущаяся с инерцией

Я пытаюсь написать скрипт камеры, но он работает не так, как задумано.

void LateUpdate(){
        if (Input.GetMouseButtonDown(0)
        {
            _lastPosition = Input.mousePosition;
        }

        if (Input.GetMouseButton(0))
        {
            var delta = _lastPosition - Input.mousePosition;
            var deltaxz = new Vector3(delta.x, 0f, delta.y);
            transform.Translate(deltaxz * Time.deltaTime, Space.World);
            _lastPosition = Input.mousePosition;
        }
}

Я написал этот код для перемещения камеры, но мышь странно двигает камеру. Если я перемещаю мышь слишком быстро, она движется быстро. Если медленно, камера движется медленнее, чем мышь.

я думаю что ScreenToWorldPoint может помочь, но камера в стиле RTS, я хочу переместить ее, как будто я двигаю землю "перетащить" \

2 ответа

Вы должны попробовать использовать Vector3.Lerp(_lastPosition, deltaxz, someValue * Time.deltaTime)

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

Это из-за deltaTime (это всегда около 0.01f-0.02f = плохая точность на большом количестве итераций). Вы можете использовать обходной путь Lerp для плавного перемещения, как Jichael, но с небольшими изменениями (он работает с transform.positon напрямую), полный код:

//new:
public float Sensitivity;

private Vector3 _lastPosition;

private void LateUpdate()
{
    if (Input.GetMouseButtonDown(0))
    {
        _lastPosition = Input.mousePosition;
    }

    if (Input.GetMouseButton(0))
    {
        var delta = (_lastPosition - Input.mousePosition);
        var deltaxz = new Vector3(delta.x, 0f, delta.y);
        //new:
        transform.position = Vector3.Lerp(transform.position, transform.position + deltaxz, Sensitivity * Time.deltaTime);
        _lastPosition = Input.mousePosition;
    }
}

PS почему вы используете LateUpdate?

Другие вопросы по тегам