本文转自blueraja
Unity官方示例中关于Lerp()函数的使用并非匀速插值,原因是Lerp()的from参数是在不断更新的,若想实现匀速插值效果,应按照类似下述方法。
using UnityEngine;
using System.Collections;
public class LerpOnSpacebarScript : MonoBehaviour
{
/// <summary>
/// The time taken to move from the start to finish positions
/// </summary>
public float timeTakenDuringLerp = 1f;
/// <summary>
/// How far the object should move when 'space' is pressed
/// </summary>
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;
/// <summary>
/// Called to begin the linear interpolation
/// </summary>
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;
}
网友评论