说到物体的移动无非就是从一个点移动到另一个点的过程。在unity中实现物体移动有很多种方式,下面就来总结一下:

1.非刚体情况
假设有物体对象obj,目标位置tarPos,帧率50,1帧时间为1/50 = 0.02;
1)直接移动到目标位置:
直接执行obj.transform.position = tarPos;可以看到物体瞬间移动到目标位置。假如该代码放在Update函数中(Update函数每帧执行一次),可以理解为1帧的时间让物体移动到了目标位置。
2)位置增量移动:
obj.transform.position = obj.transform.position+移动向量*Time.deltaTime;
obj.transform.Translate(移动向量*Time.deltaTime);
从1)中我们可以推导出obj.transform.position = obj.transform.position+(tarPos - obj.transform.position),也就是说1帧的时间物体位移了tarPos - obj.transform.position,那么           如果希望物体移动到目标位置有个平滑的过度,就可以从每帧的位移上做文章了。假如希望对象用1秒移动到目标位置tarPos也就是说1秒位移了tarPos - obj.transform.position,而1秒执行50*1 = 50帧(开头假设帧率50),那么每一帧移动距离就为(tarPos - obj.transform.position)/(50*1) = (tarPos - obj.transform.position)*(0.02*1) ,那么每一帧的变化就为obj.transform.position = obj.transform.position+(tarPos - obj.transform.position)*0.02;Time.deltaTime的意义就是这一帧距离上一帧花费的时间,即一帧花费的时间,这个时间会随着机器性能不同而不同。所以obj.transform.position = obj.transform.position+(tarPos - obj.transform.position)*Time.deltaTime*(1/花费的时间);
obj.transform.Translate(移动向量*Time.deltaTime);原理和上面的描述差不多。 
3)利用公式进行平滑移动:
Vector3.Lerp(a,b,t)
a:起点,b:终点,t:比率(若t<0 则t=0,若t>1 则t=1,0<=t<=1)
函数相当于 返回结果相当于t*b+(1-t)*a
假如起点是a是(0,0,0),终点是b是(100,0,0),t =0.1,那么结果就应该为0.1*(100,0,0)+(1-0.1)*(0,0,0) = (10,0,0),相当于根据起点终点和比               进行插值的到一个介于起点终点的值。
上面把函数介绍完了,下面就该介绍位移了:物体在Update是怎么通过该函数位移的呢?
又可以分成两种情况:1通过不断改变起点位置进行位移2通过不断改变t比率进行位移。
第一种情况:在Update中obj.transform.position  = Vertor3.Lerp(obj.transform.position ,tarPos,Time.deltaTime);
这种情况下主要关注两点,
1.首先函数返回值有赋给了物体来当起点,也就是说刚开始物体起点位置是(0,0,0),经过一帧后物体位置就变为(10,0,0),那么下一帧执行该函数时就变为0.1*(100,0,0)+(1-0.1)*(10,0,0) = (10+9,0,0)=(19,0,0),第二针相比第一针位移了19-10 = 9的距离。一直推导下去,不难发现每经过一帧物体向目标移动的具体比上一帧有所减少,所以物体向终点移动时前快后。为什么?因为起点到终点的具体每一帧都变化,每一帧起点都更趋近于终点,那么起点到终点的具体由100到90到81... ...而比率不变都是Time.deltaTime(其实每次都不同,但是误差不大,这里假设每次都相同)。更直观的理解就是100的10%和90的10%,10的10%的变化。
2.a和b不变,让t不断增加
在Start函数中用一个全局变量curPos = obj.transform.position 开保存物体的其实位置,一个全局浮点变量t记录比率 t=0;
在Update函数中obj.transform.position = Vector3.Lerp(curPos,tarPos,t);t+=Time.deltaTime;
在Update中t每经过一帧都增加Time.deltaTime比率,当t>=1时,通过公式就可以得到obj.transform.position = 1*(100,0,0)+(1-1)*(0,0,0);
注意比较这两种方式的不同,虽然都是利用同一个函数,但是使用不同的效果也不一样。
Vector3.MoveTowards (a,b,t)
       在这里的MoveTowards与Lerp又不一样,该函数是每执行一次则让a增加t,即返回a+t,如果a+t>b,则返回b,但该函数又可以同Lerp一样分两种情况:1通过不断改变起点位置进行位移2通过不断改变t比率进行位移。
假如还是以起点(0,0,0)终点(100,0,0) 举例,那么通过该函数的意义可以知道每执行一帧 起点增加t = Time.deltaTime,所以在Update中obj.transform.position = Vector3.MoveTowards(obj.transform.position,tarPos,Time.deltaTime);每帧位移举例为Time.deltaTim。也可以通过t+=Time.deltaTime进行变化,跟Lerp相似,这里就不说明了。
Vector3.SmoothDamp(a,b,ref v,t)
       a:起点,b:终点,v:当前速度,每次调用该函数都会更新,t:a到b花费的时间。
该函数执行结果是中间递增快,两边慢的类似蛇形的变化。大部分用于摄像机跟随。
2.刚体:
刚体运动一般放在FixedUpdate中
1)velocity 速度向量,如给定GetComponent<Rigidbody>().velocity = transform.forward*5;(transform.forward:对象局部坐标系z轴正方向 (0,0,1)),刚体就会朝着该方向以5单位每秒的距离移动
2)MovePosition(Vector3 tarPos
        GetComponent<Rigidbody>().MovePosition(obj.transform.position+移动向量*Time.deltaTime);  该函数参数表示要移动到的位置
原地址:http://www.manew.com/blog-127539-42236.html;

unity物体移动的几种常用方式相关推荐

  1. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式

    [方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...

  2. Silve37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)

    在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一个名 为SLConnectASP.NET的Silverlight应 ...

  3. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  4. Ngnix安装的几种常用方式

    Ngnix安装的几种常用方式 本文介绍了如何安装NGINX开源. 在稳定版还是主线版之间进行选择 在预编译的程序包和从源代码进行编译之间进行选择 安装预编译包 预建套件中包含的模块 安装预建的Cent ...

  5. java 解析/操作 xml 几种常用方式 xml的增加/删除/修改

    java 解析/操作 xml 几种常用方式 xml的增加/删除/修改 首先,我们先介绍几种常用的xml解析器. 1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方 ...

  6. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式

    IT外包服务主要分为IT运维外包和软件开发外包,对于软件开发外包主要偏于研发类型,在本文中主要讨论IT运维外包. 上海蓝盟认为,IT运维外包主要包含IT服务外包.IT采购.弱电工程.系统集成和云服务等 ...

  7. html中img显示图片的两种常用方式

    html中img显示图片的两种常用方式 显示图片,尤其是二维码的时候,大都是自动生成的,所以就需要能够从后台返回字符串,前台浏览器进行解析.好了,下面是这两种方式. 1. <img src=&q ...

  8. asp.net html silverlight 传参数,Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)...

    Silverlight实用窍门系列:37  程兴亮,网名煦风满裳 在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一 ...

  9. python 读写数据文件的6种常用方式

    本文主要介绍python读写数据文件的6种常用方式. 1. python内置方法 with open(r'test.xlsx') as f:a = f.read() 一般,在应用上述上下文管理器后,可 ...

  10. 剖析Hibernate主键生成几种常用方式

    剖析Hibernate主键生成几种常用方式 2009-09-28 10:52 佚名 IT168 字号:T | T 这里介绍Hibernate主键生成几种常用方式,由Hibernate根据不同的数据库方 ...

最新文章

  1. ios 设置tableview左滑删除按钮的相关属性
  2. yolo-mask的损失函数l包含三部分_损失函数总结-应用和trick
  3. RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡
  4. C语言中最常用标准库
  5. Python3实现TCP端口扫描器
  6. 目标检测系列(五)——Faster R-CNN译文
  7. windows采集音频
  8. NVM:使用NVM后报错npm:command not found
  9. cast函数 oracle 日期_从 Oracle 到 PostgreSQL ,某保险公司迁移实践
  10. 基于SSM流浪宠物管理系统
  11. 金蝶KIS专业版V14.1即时库存查询表添加字段条形码|商品描述|最低最高存量
  12. 敏捷-《如何准备ACP考试》知识图谱
  13. python 标准库库
  14. 陈莉君教授: 回望踏入Linux内核之旅(上篇)
  15. Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝!
  16. AoPS Volume 1 基础数论 总结
  17. 孩子不上学在家玩游戏打骂父母
  18. 待办事项Windows软件推荐
  19. 一个python爬虫工程师参加博主之星之后,必做的事情
  20. ARM CORTEX-M3简介

热门文章

  1. vs2010开发activex(MFC)控件/ie插件(一)
  2. F28335的ePWM模块
  3. Fuji-ImageJ分割中央凹无血管区
  4. Shiro集成Cas单点登录
  5. php对接工行sdk,工商银行-银企直连签约流程
  6. idea Process finished with exit code -1073741819 (0xC0000005)
  7. Unity3d美颜滤镜
  8. Vmware虚拟机win10详细安装之自定义安装
  9. MinDoc 权限的简单配置
  10. linux xps文件,Master PDF:PDF和XPS文件编辑神器