Я использую Vector3.Lerp в единой игре, чтобы просто плавно перемещать игровой объект из одной позиции в другую. Ниже мой код:

public class playermovement : MonoBehaviour {


    public float timeTakenDuringLerp = 2f;

    private bool _isLerping;

    private Vector3 _startPosition;
    private Vector3 _endPosition;

    private float _timeStartedLerping;

    void StartLerping(int i)
    {
        _isLerping = true;
        _timeStartedLerping = Time.time  ; // adding 1 to time.time here makes it wait for 1 sec before starting

        //We set the start position to the current position, and the finish to 10 spaces in the 'forward' direction
        _startPosition = transform.position;
        _endPosition = new Vector3(transform.position.x + i,transform.position.y,transform.position.z);

    }

    void Update()
    {
        //When the user hits the spacebar, we start lerping
        if(Input.GetKey(KeyCode.Space))
        {
            int i = 65;
            StartLerping(i);
        }
    }

    //We do the actual interpolation in FixedUpdate(), since we're dealing with a rigidbody
    void FixedUpdate()
    {
        if(_isLerping)
        {
            //We want percentage = 0.0 when Time.time = _timeStartedLerping
            //and percentage = 1.0 when Time.time = _timeStartedLerping + timeTakenDuringLerp
            //In other words, we want to know what percentage of "timeTakenDuringLerp" the value
            //"Time.time - _timeStartedLerping" is.
            float timeSinceStarted = Time.time - _timeStartedLerping;
            float percentageComplete = timeSinceStarted / timeTakenDuringLerp;

            //Perform the actual lerping.  Notice that the first two parameters will always be the same
            //throughout a single lerp-processs (ie. they won't change until we hit the space-bar again
            //to start another lerp)
            transform.position = Vector3.Lerp (_startPosition, _endPosition, percentageComplete);

            //When we've completed the lerp, we set _isLerping to false
            if(percentageComplete >= 1.0f)
            {
                _isLerping = false;
            }
        }
    }


}

Код работает нормально, и игровой объект плавно перемещается между двумя точками. Но чтобы добраться до места назначения, требуется около 1 секунды. Я хочу, чтобы он двигался быстрее. Я попытался уменьшить значение float timeTakenDuringLerp, но на скорость это не повлияло. Я следил за этим руководство и объяснение там также говорит об изменении переменной timeTakenDuringLerp, чтобы изменить скорость, но здесь она не работает.

Любые предложения, пожалуйста?

1
Digi Art 2 Янв 2018 в 10:59

2 ответа

Лучший ответ

Привет, спасибо за ссылку на мой блог!

Уменьшение timeTakenDuringLerp - правильное решение. Это сокращает время, необходимое объекту для перемещения от начала до конца, что является другим способом сказать «это увеличивает скорость».

Если есть конкретная скорость , с которой вы хотите, чтобы объект двигался, вам нужно сделать timeTakenDuringLerp переменной, а не константой, и установить для нее значение distance/speed. Или, еще лучше, вообще не используйте Lerp, а вместо этого установите velocity объекта, и пусть физический движок Unity позаботится об этом.

Умножение percentageComplete на константу, как предлагает @Thalthanas, неверно . Это приводит к тому, что обновления лерпинга продолжают происходить после завершения лерпинга. Это также затрудняет понимание кода, потому что timeTakenDuringLerp больше не является временем, затраченным на выполнение лерпа.

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

2
BlueRaja - Danny Pflughoeft 2 Янв 2018 в 22:15

Решение состоит в том, чтобы

Умножьте значение percentageComplete на значение speed, например,

transform.position = Vector3.Lerp (_startPosition, _endPosition, percentageComplete*speed); 

Поэтому, когда вы увеличиваете speed, он будет идти быстрее.

0
Thalthanas 2 Янв 2018 в 09:08