初学unity,关于解决有向匀速运动的问题

     在项目中,可能会遇到迅速任意方向的运动需求,要解决匀速运动大家可能会首先想到Vector3.Lerp和unity 的itween插件来解决,但是真正使用之后,你就会发现Vector3.Lerp和itween插件路径算法并不是你需要的效果,在目标点转换的时候使用这两个方法并不会匀速,两点间的距离越大速度就越快,我对itween的算法还不太了解,现在我着重解释一下怎么用Vector3.Lerp解决“变速”的问题;
      Vector3.Lerp
      static Vector3 Lerp(Vector3 from, Vector3 to, float t);假设from和to的坐标分别为(x1,y1,z1)和(x2,y2,z2),两点之间可以连成一条直线。Vector3.Lerp(from,to,t)的值(x,y,z)就是在这条直线上的一点,并且满足x-x1/x2-x1=y-y1/y2-y1=z-z1/z2-z1=t,根据这个方程求得x=t(x2-x1)+x1,y=t(y2-y1)+y1,z=t(z2-z1)+z1,即Vector3.Lerp(from,to,t)的(返回)值为(t(x2-x1)+x1,t(y2-y1)+y1,t(z2-z1)+z1),由于x1,y1,z1,x2,y2,z2都是常数,所以x,y,z随t单调递增或递减。当t=0时,x=t(x2-x1)+x1=x1,y=y1,z=z1;当t=1时,x=x2,y=y2,z=z2;当t=1/2时,x=x1+x2/2,y=y1+y2/2,z=z1+z2/2,正好为两点之间的中点。函数返回值实际上就是由from到to的直线的t分点综上所述,当0<=t<=1时,并且由0向1变化时,函数返回值沿直线由点from逐渐变化为点to。在Unity中,t<0按t=0处理,t>1按t=1处理在Update中调用该函数时,transform.position=Vector3.Lerp(transform.position,GameObject.FindWithTag("Player").transform.position,0.9f);每经过一帧,物体的位置向Player移动90%,两者之间越来越接近,但是永远不会在同一位置(特殊情况除外)。可见,只要t不为0和1,两者之间总是在逐渐接近,t越大,两者之间接近的速度越快,当t不等于1时,两者总不会在同一位置(特殊情况除外)。当t=1时,两者总在同一位置
     了解了 Vector3.Lerp每次都是按剩余百分比,这就是速度变化的原因,而想要控制速度只需要很简单的把t=1/((from - to).magnitude)就行了,每一帧都对剩余的量求解,这样就能实现匀速了。
     而方向控制就使用Quaternion.Slerp就非常容易解决。

猜你喜欢

转载自blog.csdn.net/ep661215/article/details/49756461
今日推荐