motkot
@motkot
Программирование C#.

Почему Lerp не работает правильно?

Хотел сделать систему открывания двери. Решил создать поле _openingTime, чтобы хранить время, за которое откроется дверь.

Решил использовать метод Lerp. Сначало подумал что все работает, но дверь открывается +- за секунду и от значения не зависит. Как это исправить?

Код:

using System.Collections;
using UnityEngine;
using UnityEngine.Events;

public class Door : MonoBehaviour
{
    [SerializeField] private Vector3 _rotationOffset;
    [SerializeField] private Vector3 _positionOffset;

    [SerializeField] private float _openingTime = 2f;

    [Space]

    [SerializeField] private AudioSource _openSound;
    [SerializeField] private AudioSource _closeSound;

    [SerializeField] private Transform _root;

    [Space]

    [SerializeField] private bool _justOneDiscovery;
    [SerializeField] private bool _firstOpen;

    [SerializeField] private bool _open;

    [Space]

    [SerializeField] private UnityEvent _actionEvents;


    private Transform _movingPart;

    private Vector3 _newRotation;
    private Vector3 _newPosition;

    private bool _working;

    private void Awake()
    {
        if (_root != false)
        {
            _movingPart = _root;
        }
        else
        {
            _movingPart = transform;
        }
    }

    private void Update()
    {
        if(_working)
        {
//LERP
            _movingPart.position = Vector3.Lerp(_root.position, _newPosition, _openingTime * Time.deltaTime);
            _movingPart.eulerAngles = Vector3.Lerp(_root.eulerAngles, _newRotation, _openingTime * Time.deltaTime);
        }
    }

    private void OnMouseDown()
    {
        if(!_working)
        {
            if (_justOneDiscovery && _firstOpen || !_justOneDiscovery)
            {
                if (_open)
                {
                    Close();
                }
                else
                {
                    Open();
                }

                StartCoroutine("StopWorking");
            }
        }
    }

    private void Open()
    {
        _newRotation = _movingPart.eulerAngles + _rotationOffset;
        _newPosition = _movingPart.position + _positionOffset;

        if(_openSound != null)
        {
            _openSound.Play();
        }

        if(_actionEvents != null)
        {
            _actionEvents?.Invoke();
        }

        _firstOpen = true;

        _working = true;
    }

    private void Close()
    {
        _newRotation = _movingPart.eulerAngles - _rotationOffset;
        _newPosition = _movingPart.position - _positionOffset;

        if (_openSound != null)
        {
            _closeSound.Play();
        }

        _firstOpen = true;

        _working = true;
    }

    private IEnumerator StopWorking()
    {
        yield return new WaitForSeconds(_openingTime);

        _working = false;

        _open = !_open;

        _newRotation = Vector3.zero;
        _newPosition = Vector3.zero;
    }
}
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
GavriKos
@GavriKos Куратор тега Unity
Да почитайте наконец что делает лерп и что у него значит третий аргумент! Ведет он себя абсолютно в соответствии с документацией.
Подсказка в формуле (грубо говоря):
min + (max-min)*третий_аргумент_лерпа
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы