Unity中正确使用Lerp

本文转自blueraja
Unity官方示例中关于Lerp()函数的使用并非匀速插值,原因是Lerp()的from参数是在不断更新的,若想实现匀速插值效果,应按照类似下述方法。

using UnityEngine;
using System.Collections;
 
public class LerpOnSpacebarScript : MonoBehaviour
{
    /// 
    /// The time taken to move from the start to finish positions
    /// 
    public float timeTakenDuringLerp = 1f;
 
    /// 
    /// How far the object should move when 'space' is pressed
    /// 
    public float distanceToMove = 10;
 
    //Whether we are currently interpolating or not
    private bool _isLerping;
 
    //The start and finish positions for the interpolation
    private Vector3 _startPosition;
    private Vector3 _endPosition;
 
    //The Time.time value when we started the interpolation
    private float _timeStartedLerping;
 
    /// 
    /// Called to begin the linear interpolation
    /// 
    void StartLerping()
    {
        _isLerping = true;
        _timeStartedLerping = Time.time;
 
        //We set the start position to the current position, and the finish to 10 spaces in the 'forward' direction
        _startPosition = transform.position;
        _endPosition = transform.position + Vector3.forward*distanceToMove;
    }
 
    void Update()
    {
        //When the user hits the spacebar, we start lerping
        if(Input.GetKey(KeyCode.Space))
        {
            StartLerping();
        }
    }
 
    //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;
            }
        }
    }
}

最后附上Lerp()的内部实现:

public static Vector3 Lerp(Vector3 start, Vector3 finish, float percentage)
{
    //Make sure percentage is in the range [0.0, 1.0]
    percentage = Mathf.Clamp01(percentage);
 
    //(finish-start) is the Vector3 drawn between 'start' and 'finish'
    Vector3 startToFinish = finish - start;
 
    //Multiply it by percentage and set its origin to 'start'
    return start + startToFinish * percentage;
}

你可能感兴趣的:(Unity中正确使用Lerp)