MoveTowards、Lerp、Slerp
1:MoveTowards
MoveTowards(Vector2 current, Vector2 target, float maxDistanceDelta);
current:当前位置
target:目标位置
maxDistanceDelta: 每次移动的距离
返回值是当current值加上maxDistanceDelta的值,如果这个值超过了target,返回的就是target的值。
2:Lerp
Lerp表示线性插值
Mathf.Lerp(1,10,1);
public static float Lerp(float a, float b, float t);
它的作用就是按照t计算a和b之间的插值。t的取值范围是[0, 1]。
简单理解就是当t=0, 返回值是a,当t=1,返回值是b。同理,t=0.1时是a到b的10%。t就代表了a到b的百分比。
3:Slerp
球形插值在Vector3、Quaternion等类都有使用,一般多在Quaternion的旋转操作时使用。
public static Vector3 Slerp(Vector3 a, Vector3 b, float t);
这里球形插值与线性插值不同的地方在于,它将Vectors视为方向而不再是点。返回的向量方向,它的角度是根据a和b的角度插值,而它的长度是根据a和b的长度插值。
可以用其模拟太阳的升降变化等操作。
public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
计算a与b的球形插值。
Quaternion的Lerp与Slerp结果都是一样的,Lerp的效率会比Slerp高些,但是当旋转值a和b离得比较远时,Lerp的效果会非常差。
对于插值(Slerp和Lerp)运算中的t,要明白它代表的是百分比,直接对齐赋值时间如Time.deltaTime是没意义的,因为如果t为1的话,永远都不会到达目标值