Lerp 实现匀速运动
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 实现匀速运动相关推荐
- unity3d Vector3.Lerp解析
Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html 手册中描述的不是很详细,什么叫"按照数字t在from到 ...
- 【超级入门】Lerp 实现平滑运动(由快到慢/匀速)
1:API: Lerp (起点,终点,时间) public static Vector3 Lerp(Vector3 a, Vector3 b, float t); 我们看一下底层的解释: // 摘要: ...
- Unity物体移动的几种方式与表现(Lerp,SmoothDamp,MoveTowards的区别)
Unity匀速移动的几种方案 看看Lerp,SmoothDamp,MoveTowards的区别. 速览 Lerp用于插值,本身不是用于移动的API.但可以和协程配合用于移动. SmoothDamp用于 ...
- Unity的Lerp插值运算
float result = Mathf.Lerp(float a, float b, float time) Vector3 res = Vector3.Lerp(Vector3 startPos, ...
- 【Unity3d】使用插值函数Lerp实现自动升降平台
Unity的插值函数允许我们计算位于两个给定点之间某处的值.其中的函数行为各不相同,适用于不同的情况,有关更多信息,可以查阅Unity中文文档(重要的类 - Mathf),下面我将介绍如何使用插值函数 ...
- 12,缓冲运动。匀速运动停止条件
缓冲运动:iSpeed=(iTarget-oDiv.offsetLeft)/7;速度离目标点越远,速度越大,离目标点越近速度越小: 只支持1px是最小单位,没有0.5px.所以当iSpeed为小数时如 ...
- Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理
原文:Javascript 匀速运动停止条件--逐行分析代码,让你轻松了运动的原理 我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 < ...
- [js高手之路]打造通用的匀速运动框架
本文,是接着上文[js高手之路]匀速运动与实例实战(侧边栏,淡入淡出)继续的,在这篇文章的最后,我们做了2个小实例:侧边栏与改变透明度的淡入淡出效果,本文我们把上文的animate函数,继续改造,让他 ...
- UA PHYS515A 电磁理论V 电磁波与辐射8 单个粒子的辐射 匀速运动与匀加速运动的情况
UA PHYS515A 电磁理论V 电磁波与辐射8 单个粒子的辐射 匀速运动与匀加速运动的情况 单个粒子的辐射场满足: E=q((n^−β⃗)(1−β⃗2)(1−n^⋅β⃗)3R2+n^×[n^−β⃗ ...
最新文章
- LINUX 基础命令 一
- 语言 micropython_MicroPython蓝牙BLE例程实操(一)
- 将Glassfish 3连接到外部ActiveMQ 5代理
- 大话数据结构——算法
- Node.js 安装配置
- saltstack之混合匹配
- Android 应用开发(41)---EditText(输入框)详解
- 线程池中 corePoolSize, maximumPoolSize, poolSize理解
- 基于Freemarker模板引擎的Java代码生成器
- 金山毒霸系统清理专家
- 上映4天,票房7.4亿的《海王》,用Python分析数据看大片!
- 头条极速版问答自动化教程
- 基于普中A2开发板(STC80C51单片机)呈现的中断小实验代码电路及其效果。
- 绿色商业包装材料在行业中的重要地位
- 在线直播源码评论弹幕是如何“练”成的?
- 手机端网页技术--使自己做的asp.net网页适应手机浏览
- 从零构建通讯器--7.1过往总结和心跳包代码实战
- 【技术公开课】Redis从入门到实践
- 2019,收获,静静等待
- 主动/被动唤醒源与网络主动/被动唤醒
热门文章
- 怎样在Gitee创建自己的博客
- 课程思政案例----简道云零代码应用开发实训平台
- STM32开漏输出原理
- 第三百四十六章 四相环
- jquery的$.alerts.alert怎么实现点击后跳转页面
- 【bug】关于微信ios展示页面的url和实际url不一致的问题
- 示范性微电子院校“抢人”,芯片赛道黄不了!
- Jodd发送json
- Ruby‘s Adventrue游戏制作笔记(十七)Unity添加游戏胜利条件和失败条件和导出游戏
- 专科计算机及应用实践课怎么考,2017年下半年自学考试计算机及应用(专科、独立本科段)专业实验课程考核安排...