一:Transform

——transform.Translate:不会考虑到碰撞
transform.Translate(Vector3 targetPos,指定参照坐标系(默认为Space.Self))

——transform.position:直接改变物体的坐标


二:刚体

——MovePosition

——velocity:使物体忽略静摩擦力,从静止状态快速进入运动状态

——AddForce:给物体添加一个方向力

FoeceMode:例如物理质量m为2,力f为(10,0,0),已知动量定理:F*t = m*v
——Force:添加一个可持续力到刚体,使用它的质量
10*0.02=2*v,速度为0.1m/s
——Acceleration:添加一个可持续加速度到刚体,忽略它的质量
忽略质量则质量m为默认1,10*0.02=1*v,速度为0.2m/s
——Impulse:添加一个瞬间冲击力到刚体 ,使用它的质量( 爆炸或碰撞力量 )
采用瞬间力,则不使用系统的时间间隔,默认t为1,10*1=2*v,速度为5m/s
——VelocityChange:添加一个瞬间速度变化给刚体,忽略它的质量
忽略质量则质量m为默认1,采用瞬间力,则不使用系统的时间间隔,默认t为1,10*1=1*v,速度为10m/s


三:角色控制器

——SimpleMove:模拟重力,返回值表示当前角色是否着地

——Move:不模拟重力,返回值表示角色于周围的碰撞信息


四:平滑

——Lerp:线性插值移动(先快后慢)

Lerp函数的计算公式:a+t(b-a)

假如从起始点a点到目标点b点,当前运动到的点为c点,需要求出已经运动的距离占总距离的多少,也就是a和c的距离占a和b的距离的比例
那么t=(c-a)/(b-a),解出tb-ta=c-a,所以t(b-a)=c-a,则c=t(b-a)+a
它是一种无限接近的移动,一般需要自己判断一下如果距离目标点小于某个值就直接设置成目标点

using System;
using UnityEngine;public class Test : MonoBehaviour
{public GameObject go;public Transform targetTran;private float t = 0.01f;private void Update(){if (Vector2.Distance(go.transform.position, targetTran.position) <= 0.2f){go.transform.position = targetTran.position;}go.transform.position = Vector3.Lerp(go.transform.position, targetTran.position, t);}
}

两种方式使用Lerp实现匀速移动的指定时间到达目标点

using System;
using UnityEngine;public class Test : MonoBehaviour
{public GameObject go;public Transform targetTran;private Vector3 startPos;private float totalTime = 5;Vector3 deltaPos;public void Start(){startPos = go.transform.position;deltaPos = Vector3.Lerp(startPos, targetTran.position, Time.fixedDeltaTime / totalTime) - startPos;}private void FixedUpdate(){if (Vector2.Distance(go.transform.position, targetTran.position) <= 0.2f){go.transform.position = targetTran.position;}go.transform.position += deltaPos;}
}
using System;
using UnityEngine;public class Test : MonoBehaviour
{public GameObject go;public Transform targetTran;private Vector3 startPos;private float totalTime = 7;public void Start(){startPos = go.transform.position;}private void Update(){Vector3 targetPos = Vector3.Lerp(startPos, targetTran.position, (Time.time - 0) / totalTime);go.transform.position = targetPos;}
}

——SmoothDamp:平滑阻尼移动,与Lerp效果类似(先快后慢),只不过效果更加平滑,常用于相机跟随操作
因为它不像Lerp那么简单它的内部参数经过了很多次的调整所以效果会更加平滑

——MoveTowards:匀速移动(其实向目标点的最后一次移动会有偏差)
maxDelta参数表示每次移动最大的距离,不会超过这个值

——Slerp:球形插值


五:特殊

——Mathf.PingPong:乒乓循环运动,返回一个[t,length)的值

using UnityEngine;public class Test : MonoBehaviour
{public GameObject go;private float moveDis = 3;private float totalTime = 5;private Vector3 startPos;private float v;public void Start(){startPos = go.transform.position;}private void Update(){v += Time.deltaTime * moveDis / totalTime;float x = Mathf.PingPong(v, moveDis);go.transform.position = startPos + new Vector3(x, 0, 0);}
}

注意PingPang的内部实现中,length会作为分子出现,如果length为0时会报NaN(Not a Number)的错误。

Unity中关于NaN的问题:Unity中关于NaN的问题

——Math.Repeat:返回一个[t,length)的值

Unity中物体移动方法详解相关推荐

  1. Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animat ...

  2. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  3. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  4. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  5. php 文件扫描去重,PHP中的去重方法详解和文件下载

    本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...

  6. keep alive PHP,vue中keep-alive使用方法详解

    这次给大家带来vue中keep-alive使用方法详解,vue中keep-alive使用的注意事项有哪些,下面就是实战案例,一起来看一下. 1.keep-alive的作用以及好处 在做电商有关的项目中 ...

  7. java中main是什么_Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  8. session在PHP中的用法,PHP中session使用方法详解

    php中session详解 综述 Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.从上述的定义中我们可以看到,Session实际 ...

  9. Promise中的then方法详解

    Promise详解 /* * 创建Promise实例的时候得传一个函数 executor,并且这个函数接收两个参数+ resolve函数:将实例的状态从 pending 修改为 fulfilled/r ...

最新文章

  1. dell服务器清空系统空间,PowerEdge 服务器上的内存配置错误。
  2. 光脚丫学LINQ(025):如何验证DBML和外部映射文件
  3. ubuntu 12.04解决Broadcom STA无线网卡驱动安装失败解决
  4. QtCreator 如何将开发的程序打包成exe
  5. Silverlight 5 Features
  6. 接收list对象_PyTorch入门视频笔记从数组、列表对象中创建Tensor
  7. 即将上线的Kafka 集群(用CM部署的)无法使用“--bootstrap-server”进行消费,怎么破?...
  8. C++编译器默默编写并调用哪些函数
  9. 安卓自定义相机拍照功能全解(不调用系统相机)
  10. FreeSwitch视频会议,4路以上CPU占用暴增的原因
  11. html字体溢出问题,CSS教程:关于文字溢出问题的研究
  12. echarts3力引导布局,固定某节点
  13. Snagit 2020 Windows和macOS苹果版汉化版中文版汉化补丁Snagit中文网Snagit中文官网camsnag.com/snagit
  14. 如何下载省市县行政区划及乡镇边界
  15. 沙箱环境和正式环境【PayPal接入(java)】【IPN通知问题】项目实战干货总结记录!
  16. 当Top-k遇到深度学习
  17. 端端Clouduolc的安全机制
  18. 三重积分平均值_二重积分或者三重积分里面如果积分区域关于坐标轴对称比如积分区域是一个圆或者球,就只用求第一象限或卦...
  19. 为啥联通卡显示无服务器,天津联通物联卡显示无服务器
  20. ABP框架引入easyUI

热门文章

  1. 项目实训(十)—提取视频特征
  2. 若将瑞星比Borland 刘旭略胜Anders
  3. 学习笔记5-梯度爆炸和梯度消失(K折交叉验证)
  4. PLC的ST编程方式--文本编程,简洁啊
  5. 抖音扫码获取cookie带倒计时刷新(PHP+ajax)
  6. 百度地图显示无法连接服务器,百度地图为什么打不开该怎么解决
  7. ue4 渲染等优化参考点。
  8. iview表单重置以及重置验证信息
  9. 《Flask develoment》云平台heroku部署过程
  10. [附源码]Nodejs计算机毕业设计基于JAVA语言的国货美妆店管理系统Express(程序+LW)