Lerp 实现匀速运动「建议收藏」

Lerp 实现匀速运动「建议收藏」Mathf.Lerp的常见误用是Update(){Transform.position=newVector3(transform.position.x,targetPosition,Time.deltaTime);}首先它是这样工作的:每帧都重新获取物体当前的位置,计算物体和目标距离的差距,再按照当前帧的持续时间(当做一个百分比)来移动这个比例的位置。因此整体运动是缓动的,先

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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

Lerp的常见“误用”是

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

Jetbrains全家桶1年46,售后保障稳定

说是“误用”,其实也不完全正确,这种用法是可以工作的,但是常常不是大家的真正需求,很多时候大家使用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倍。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206292.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • EDA软件_Protel99se导出坐标教程「建议收藏」

    EDA软件_Protel99se导出坐标教程「建议收藏」本文整理记录了使用Protel99se导出坐标文件的过程。

    2022年5月30日
    151
  • 安卓—项目中插入百度地图sdk

    安卓—项目中插入百度地图sdk

    2022年1月19日
    49
  • 学成在线源代码(学成网首页代码)

    首先同一目录下放置三个文件夹(imagesxxx.htmlstyle.css)图片:头部区域分四个模块:logo(图片)导航栏(无序列表)搜索(文本输入框、button按钮)用户(图片)<divclass=”headerw”><!–logo部分–><divclass=”logo”><!–alt显示未加载时,所提示的文字,title显示鼠标放上时,所提示的文件

    2022年4月16日
    161
  • python 中文文本分类[通俗易懂]

    python 中文文本分类[通俗易懂]写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。赏金将用于拉萨儿童图书公益募捐手机扫一扫,即可:目标读者:初级入门学生。本文假定,你对python已经有了最基本的掌握。如果你希望能够

    2022年6月13日
    38
  • python下载及安装

    python下载及安装1, 许多新学员不知道开始学Python需要安装什么,需要准备什么,特地写下这篇文档给一脸懵逼的新同学们作为指导文档。2, 首先,学Python需要有一台电脑,这是必须的。老师的

    2022年7月3日
    22
  • linux内核编译详解[通俗易懂]

    linux内核编译详解[通俗易懂]前言Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的模块化设计,支持内核线程以及动态装载内核模块的能力。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果…

    2022年7月23日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号