Как реализовать эффект инерции при вращении камеры в Unity?

Как добавить инерцию к вращению камеры вокруг объекта после отпускания кнопки мыши в данном коде реализации вращения с помощью мыши?
  • 29 апреля 2024 г. 13:10
Ответы на вопрос 2
Для реализации эффекта инерции при вращении камеры в Unity после отпускания кнопки мыши можно воспользоваться следующим подходом:

1. Создайте переменную для хранения скорости вращения камеры после отпускания кнопки мыши.

```csharp
public float rotationSpeed = 5f;
public float damping = 0.9f;
private Vector3 lastMousePosition;
private Vector3 newMousePosition;
private Vector3 deltaMousePosition;
private Vector3 rotationVelocity;
```

2. В методе Update() добавьте следующий код для записи текущего и предыдущего положения мыши и вычисления изменения положения мыши:

```csharp
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        lastMousePosition = Input.mousePosition;
    }

    if (Input.GetMouseButton(0))
    {
        newMousePosition = Input.mousePosition;
        deltaMousePosition = newMousePosition - lastMousePosition;

        // Рассчитываем скорость вращения камеры
        rotationVelocity += new Vector3(-deltaMousePosition.y, deltaMousePosition.x, 0) * rotationSpeed;

        lastMousePosition = newMousePosition;
    }

    // Применяем инерцию к вращению камеры
    rotationVelocity *= damping;
    transform.Rotate(rotationVelocity * Time.deltaTime);
}
```

3. Убедитесь, что у вас есть объект, к которому камера должна вращаться, и что камера находится в правильной позиции относительно этого объекта.

Теперь при вращении камеры с помощью мыши и отпускании кнопки мыши камера будет продолжать вращаться с инерцией. Подберите значения переменных rotationSpeed и damping для достижения желаемого эффекта инерции.
using UnityEngine;
 
public class Rotate : MonoBehaviour
{
    float _currentSpeed;
    float _targetSpeed;
    [SerializeField] float _speedRotate;
    const float c_acceleration = 20f;
    const float c_di_acceleration = 10f;
    float _acceleration;

    private void Update()
    {
        _targetSpeed = Input.GetAxis("Mouse Y")*_speedRotate;
        _acceleration = _targetSpeed != 0 ? c_acceleration : c_di_acceleration;
        _currentSpeed = Mathf.MoveTowards(_currentSpeed, _targetSpeed, _acceleration * Time.deltaTime);
    }

}

с константами надо поиграть что бы не было задержки при вращении
Похожие вопросы