Lerp函数在Mathf,Vector3, 等类中都有,用法都类似,作用都是按照百分比取得从一个值过度到另外一个值的中间值。下面说的内容针对各中类的Lerp函数都是通用的。

Lerp的常见“误用”是

Update()
{Transform.position = Vector3.Lerp(transform.position.x, targetPosition, Time.deltaTime);
}

说是“误用”,其实也不完全正确,这种用法是可以工作的,但是常常不是大家的真正需求,很多时候大家使用Lerp都是想达到匀速运动的效果,但如下“误用”却让对象以逐渐降低的速度运动。

首先,上述“误用”是这样工作的:每帧都重新获取物体当前的位置,计算物体和目标距离的差距,再按照当前帧的持续时间(当做一个百分比)来移动这个比例的位置。因此如果目标位置始终是固定的,那么整体运动是缓动的,先快后慢。这样的效果乍一看还不错,但其实是有一些问题的:因为每秒钟都以固定的比例靠近目标位置,所以运动速度会以固定的比例逐渐降低,只要运算精度够高,运动永远达不到目标,且运算始终在进行。如果确实需要这样做,那么我们需要加上一个阈值,当与目标距离小于这个阈值时,就直接把物体的位置设置为目标位置。这个阈值的大小设置要合适,太大了在后面阶段会感觉到明显的跳跃,太小了会浪费运算时间。

这里说明一下,如果上述效果就是我们想达到的目标,那么用Time.deltaTime作为第三个参数在这个情况下是有道理的,因为每帧时间不同,为了保证单位时间内运动的百分比是一致的(达到平滑缓动的效果),需要用Time.deltTime介入。

如果你是误打误撞实现了缓动效果,并且觉得效果不错就没有再深究了,那么建议你继续往下看看。

用Lerp来实现匀速运动的代码

先看代码:

float speed = 2.0f;//什么时候开始运动
float startTime = 2.0f;//起始X位置
float startX = 0.0f;//结束X位置
float endX = 0.0f;void Update()
{float lerpValue = Mathf.Lerp(startX,endX,(Time.time-startTime )* speed);transform.position = new Vector3(lerpValue,0,0);
}

一定要理解清楚Mathf.Lerp(float a, float b, float t)第三个参数t的意义,它是一个百分比,最小值有效值是0,最大有效值是1,如果超出了1,就取1,小于0则取0.

它表示从a到b之间,按照t这个百分比来取值,例如a是0,b是100,如果t是0.2,则该函数返回的值是20,如果t是1,该函数返回的值为100.

匀速运动的要点是起始值和结束值都是固定好的,不会随着运动而发生变化。

Time.time就是系统运行时间,也就是这个程序开始到现在的时长。

(Time.time - startTime),上面例子中startTime是2.0f,那么这个式子的取值一开始是-2,2秒时变成0,3秒时变成1,先假设没有乘以speed这个值,整个运动过程会在2秒开始,3秒结束。

物体运动的速度是距离差(在本例中是10.0f)除以1秒。乘以一个speed以后,实际上是在调整整体的运动时间。
假设speed为0.1f,则运动的时间变为2秒开始12秒结束,运行时间变成了10,则速度变成原先的1/10,
同理,假设speed 为10f,则运动时间变为2秒开始2.1秒结束,速度变成原先的10倍。

Lerp 实现匀速运动相关推荐

  1. unity3d Vector3.Lerp解析

    Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html 手册中描述的不是很详细,什么叫"按照数字t在from到 ...

  2. 【超级入门】Lerp 实现平滑运动(由快到慢/匀速)

    1:API: Lerp (起点,终点,时间) public static Vector3 Lerp(Vector3 a, Vector3 b, float t); 我们看一下底层的解释: // 摘要: ...

  3. Unity物体移动的几种方式与表现(Lerp,SmoothDamp,MoveTowards的区别)

    Unity匀速移动的几种方案 看看Lerp,SmoothDamp,MoveTowards的区别. 速览 Lerp用于插值,本身不是用于移动的API.但可以和协程配合用于移动. SmoothDamp用于 ...

  4. Unity的Lerp插值运算

    float result = Mathf.Lerp(float a, float b, float time) Vector3 res = Vector3.Lerp(Vector3 startPos, ...

  5. 【Unity3d】使用插值函数Lerp实现自动升降平台

    Unity的插值函数允许我们计算位于两个给定点之间某处的值.其中的函数行为各不相同,适用于不同的情况,有关更多信息,可以查阅Unity中文文档(重要的类 - Mathf),下面我将介绍如何使用插值函数 ...

  6. 12,缓冲运动。匀速运动停止条件

    缓冲运动:iSpeed=(iTarget-oDiv.offsetLeft)/7;速度离目标点越远,速度越大,离目标点越近速度越小: 只支持1px是最小单位,没有0.5px.所以当iSpeed为小数时如 ...

  7. Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理

    原文:Javascript 匀速运动停止条件--逐行分析代码,让你轻松了运动的原理 我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 < ...

  8. [js高手之路]打造通用的匀速运动框架

    本文,是接着上文[js高手之路]匀速运动与实例实战(侧边栏,淡入淡出)继续的,在这篇文章的最后,我们做了2个小实例:侧边栏与改变透明度的淡入淡出效果,本文我们把上文的animate函数,继续改造,让他 ...

  9. UA PHYS515A 电磁理论V 电磁波与辐射8 单个粒子的辐射 匀速运动与匀加速运动的情况

    UA PHYS515A 电磁理论V 电磁波与辐射8 单个粒子的辐射 匀速运动与匀加速运动的情况 单个粒子的辐射场满足: E=q((n^−β⃗)(1−β⃗2)(1−n^⋅β⃗)3R2+n^×[n^−β⃗ ...

最新文章

  1. LINUX 基础命令 一
  2. 语言 micropython_MicroPython蓝牙BLE例程实操(一)
  3. 将Glassfish 3连接到外部ActiveMQ 5代理
  4. 大话数据结构——算法
  5. Node.js 安装配置
  6. saltstack之混合匹配
  7. Android 应用开发(41)---EditText(输入框)详解
  8. 线程池中 corePoolSize, maximumPoolSize, poolSize理解
  9. 基于Freemarker模板引擎的Java代码生成器
  10. 金山毒霸系统清理专家
  11. 上映4天,票房7.4亿的《海王》,用Python分析数据看大片!
  12. 头条极速版问答自动化教程
  13. 基于普中A2开发板(STC80C51单片机)呈现的中断小实验代码电路及其效果。
  14. 绿色商业包装材料在行业中的重要地位
  15. 在线直播源码评论弹幕是如何“练”成的?
  16. 手机端网页技术--使自己做的asp.net网页适应手机浏览
  17. 从零构建通讯器--7.1过往总结和心跳包代码实战
  18. 【技术公开课】Redis从入门到实践
  19. 2019,收获,静静等待
  20. 主动/被动唤醒源与网络主动/被动唤醒

热门文章

  1. 怎样在Gitee创建自己的博客
  2. 课程思政案例----简道云零代码应用开发实训平台
  3. STM32开漏输出原理
  4. 第三百四十六章 四相环
  5. jquery的$.alerts.alert怎么实现点击后跳转页面
  6. 【bug】关于微信ios展示页面的url和实际url不一致的问题
  7. 示范性微电子院校“抢人”,芯片赛道黄不了!
  8. Jodd发送json
  9. Ruby‘s Adventrue游戏制作笔记(十七)Unity添加游戏胜利条件和失败条件和导出游戏
  10. 专科计算机及应用实践课怎么考,2017年下半年自学考试计算机及应用(专科、独立本科段)专业实验课程考核安排...