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

流年Bast 2015-11-10 10:20:54
在项目中,可能会遇到迅速任意方向的运动需求,要解决匀速运动大家可能会首先想到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就非常容易解决。
...全文
1516 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
kvls 2015-12-03
  • 打赏
  • 举报
回复
亲,不知道你需要问什么,如果是匀速运动的话,为什么不直接设置一个速度,然后在Update里面根据deltaTime自己算一个位移,最多加一个是否到达终点的判断

2,535

社区成员

发帖
与我相关
我的任务
社区描述
Unity3D相关内容讨论专区
游戏unity 技术论坛(原bbs)
社区管理员
  • Unity3D
  • 芝麻粒儿
  • 「已注销」
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Unity3D社区公告:

  1. 社区致力于解决各种Unity3D相关的“疑难杂症”。
  2. 社区不允许发布与Unity3D或相关技术无关内容。
  3. 社区版主邀请各位一道为打造优秀社区不懈努力。

试试用AI创作助手写篇文章吧