Unity匀速移动的几种方案 Lerp,SmoothDamp,MoveTowards
速览
Lerp用于插值,可以和协程配合用于移动。
SmoothDamp是阻尼移动,从不超过。
MoveTowards是匀速移动,也不会超过。
方案1,使用Lerp——先快后慢运动(线性衰减) (不好用✖)
Lerp最简单的用法如下:
void Update(){
transform.position = Vector3.Lerp(transform.position, endPos, Time.deltaTime / lerpDuration);
}
效果是非匀速的(逐渐逼近),可以看到在接近终点时有明显的减速。
方案2,使用Lerp也可以实现——平滑移动 (不好用✖)
Lerp控制三个变量,也是可以实现平滑移动的
void Update(){
// 平滑版,引入startPos,lerpFinish,time 3个变量——太麻烦了
if (!lerpFinish)
{
if (time == 0)
{
startPos = transform.position;
}
if (time < lerpDuration)
{
time += Time.deltaTime;
}
else
{
time = lerpDuration;
lerpFinish = true;
}
transform.position = Vector3.Lerp(startPos, endPos, time / lerpDuration);
}
}
就是引入了三个新变量,而且必须是类的成员变量,太麻烦了。
方案3,使用协程+Lerp —— 匀速运动 (好用✔)
// v3 用协程,只需要引进两个局部变量startPos和time,且不用update了(性能好一点),即用即关
StartCoroutine(LerpSelf());
private IEnumerator LerpSelf()
{
Vector3 startPos = transform.position;
float time = 0;
while (time < lerpDuration)
{
time += Time.deltaTime;
transform.position = Vector3.Lerp(startPos, endPos, time / lerpDuration);
yield return null;
}
transform.position = endPos;
}
方案4,使用SmoothDamp —— 先快后慢运动(平方衰减) (好用✔)
void Update(){
transform.position = Vector3.SmoothDamp(transform.position, endPos, ref velocity, 0.65f);
}
方案5:使用MoveTowards —— 匀速运动 (好用✔)
void Update(){
transform.position = Vector3.MoveTowards(transform.position, endPos, Time.deltaTime / lerpDuration * 20);
}
Lerp更像是线性衰减,而SmoothDamp像是弧形衰减,两者都是由快而慢
其中SmoothDamp多用于相机跟随。但如果其他类型的插值,我个人觉的其实都差不多
1.Transform.Translate
2.Vectoe3.Lerp
3. Vector3.SmoothDamp
4.Rigidbody 的 velocity
rb.velocity =new Vector3(1,0,0);//只设置x方向速度为1
5.AddForce
6. MoveTowards
Rigidbody.velocity
这个方法是瞬间给物体一个恒定的速度,将物体提升至该速度。
Rigidbody.addForce
这个方法瞬间给物体一个规定好的力
这两者有什么不同呢?
举个例子大家就明白了:
假设我们想要做一个2D的跳跃游戏,在这个游戏里我希望我按下跳跃键的时候,游戏物体的跳跃高度是恒定的。那么,如果此时我使用的是addForce显然不会满足我的效果,因为经过测试,每按一下跳跃键,它会被施加一个恒定的力,它跳跃的初始速度会越变越大,每次跳跃的高度和前一次相较变得越来越大(在连续跳跃的情况下),也就是可以理解成,我现在被施加了一个大小为50的力,在重力作用下我的力的效果在减小,在正向速度还没有完全消失的情况下,此时我又按了一下跳跃键,那么就会在这个力的基础上再施加一次大小为50的力,物体会越跳越快,越跳越高。
而此时如果我们使用的是velocity方法改变它的初始速度到我们希望的值和方向,那么当我们按下跳跃键的时候,无论此时物体减速到何种情况,也最多只会提升到我们规定的速度以及朝向我们规定的方向。初始速度不变的情况下,跳跃高度也是恒定的。
这就是他们两个的区别,一个是持续施加,一个是有限施加。