Unity 3d | Как сделать плавную смену FOV?

Рейтинг: 0Ответов: 2Опубликовано: 30.06.2023

Нужна именно плавное изменение FOV, сейчас оно резкое(даже если lerptime слишком большой или слишком маленький). Пробовал умножать на Time.deltatime, Time.time, так же, вместо Lerp() использовать MoveTowards и циклом for с задержкой, ничего из этого не помогло сделать смену плавной. Метод вызывается в Update()

 private void MovementUpdate()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGroundCheck()) 
    { Rb.AddForce(new Vector3(0, 1, 0) * JumpForce); }



    if (Input.GetKeyDown(KeyCode.LeftShift) && !(IsCrouched)){
        Speed += 300;
        Camera.fieldOfView = Mathf.Lerp(Camera.fieldOfView, RunFOV, lerpTime);
    }
    else if (Input.GetKeyUp(KeyCode.LeftShift)) { if (Speed > 500){
            Speed -= 300;
            Camera.fieldOfView = Mathf.Lerp(Camera.fieldOfView, NormalFOV, lerpTime);
        }
    }

Ответы

▲ 2

Управление это одна история, персонаж другая, камера третья, это вообще должно быть три разных класса! Мухи отдельно, котлеты отдельно!

public class ActionFOV : MonoBehaviour
{
    [SerializeField] float _default = 40f;
    [SerializeField] float _action = 60f;
    [Space]
    [SerializeField] float _toDefaultSpeed = 10f;
    [SerializeField] float _toActionSpeed = 40f;
    private Camera _camera;
    private float _current;

    public bool IsAction { get; set; }

    private void Start ()
    {
        _camera = Camera.main;
        _current = _default;
    }

    private void Update ()
    {
        if (IsAction)
            _current += _toActionSpeed * Mathf.Sign(_action - _default);
        else
            _current += _toDefaultSpeed * Mathf.Sign(_default - _action);
        _current = Mathf.Clamp(_current, _default, _action);
        _camera.fieldOfView = _current;
    }
}
▲ -1

Проблема решена, вместо GetKeyDown поставил GetKey(в другом условии, не трогая скорость).