首页 > 其他分享 >Unity匀速移动的几种方案 Lerp,SmoothDamp,MoveTowards

Unity匀速移动的几种方案 Lerp,SmoothDamp,MoveTowards

时间:2024-08-09 10:54:45浏览次数:9  
标签:Lerp transform Unity time position SmoothDamp lerpDuration

速览

Lerp用于插值,可以和协程配合用于移动。
SmoothDamp是阻尼移动,从不超过。
MoveTowards是匀速移动,也不会超过。

 

方案1,使用Lerp——先快后慢运动(线性衰减) (不好用✖)

Lerp最简单的用法如下:

void Update(){
transform.position = Vector3.Lerp(transform.position, endPos, Time.deltaTime / lerpDuration);
}

效果是非匀速的(逐渐逼近),可以看到在接近终点时有明显的减速。 

方案2,使用Lerp也可以实现——平滑移动 (不好用✖)

Lerp控制三个变量,也是可以实现平滑移动的

void Update(){
// 平滑版,引入startPos,lerpFinish,time 3个变量——太麻烦了
if (!lerpFinish)
{
if (time == 0)
{
startPos = transform.position;
}
if (time < lerpDuration)
{
time += Time.deltaTime;
}
else
{
time = lerpDuration;
lerpFinish = true;
}
transform.position = Vector3.Lerp(startPos, endPos, time / lerpDuration);
}
}

就是引入了三个新变量,而且必须是类的成员变量,太麻烦了。 

方案3,使用协程+Lerp —— 匀速运动 (好用✔)

// v3 用协程,只需要引进两个局部变量startPos和time,且不用update了(性能好一点),即用即关
StartCoroutine(LerpSelf());
private IEnumerator LerpSelf()
{
Vector3 startPos = transform.position;
float time = 0;
while (time < lerpDuration)
{
time += Time.deltaTime;
transform.position = Vector3.Lerp(startPos, endPos, time / lerpDuration);
yield return null;
}
transform.position = endPos;
}

方案4,使用SmoothDamp —— 先快后慢运动(平方衰减) (好用✔)

void Update(){
transform.position = Vector3.SmoothDamp(transform.position, endPos, ref velocity, 0.65f);
}

方案5:使用MoveTowards —— 匀速运动 (好用✔)

void Update(){
transform.position = Vector3.MoveTowards(transform.position, endPos, Time.deltaTime / lerpDuration * 20);
}

 

 

Lerp更像是线性衰减,而SmoothDamp像是弧形衰减,两者都是由快而慢

其中SmoothDamp多用于相机跟随。但如果其他类型的插值,我个人觉的其实都差不多


标签:Lerp,transform,Unity,time,position,SmoothDamp,lerpDuration
From: https://www.cnblogs.com/porter/p/18350390

相关文章

  • unity destory的坑
    网上已经有相关信息,这里只是为自己记录一下destory只是将他标记为需要删除,并不会马上删除和清理缓存,会在当前帧结束时(也即是在当前帧不能直接删除掉所有的物体),将所有标记为需要删除的对象,进行删除和缓存清理,它是异步执行的,不会影响主线程的执行,并且更加节省性能。所以说在当前......
  • Unity物理模块 之 ​2D碰撞器
    本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正1.碰撞器是什么在Unity中,碰撞器(Collider)是一种组件,用于检测物体之间的物理交互,注意他不是常规意义上物理反馈,而是利用碰撞检测进入函数中通过代码来控制效......
  • NGUI扩展模块:Unity-NGUIExtension
    在Unity3D开发过程中,NGUI是一个强大的UI框架,它提供了一系列的扩展模块来增强我们的用户体验和开发效率。Unity-NGUIExtension是一系列NGUI的扩展模块,这些模块能够为我们的Unity项目带来额外的功能和优化。模块概览UIShaderSpriteUIShaderSprite模块允许我们在NGUI的图集(a......
  • Visual Studio Community安装WebForm创建和数据连接
    目录一、安装VisualStudioCommunity1.下载VisualStudioCommunity2.双击安装3.配置二、项目创建1.创建新项目2.配置新项目3.创建web窗体4.代码分部5.文件打开问题三、数据库访问1.自己先装一个sqlserver2.创建实体数据模型3.创建连接4.修改更新 四、项目......
  • Unity使用多屏幕Display以及不同屏幕的射线检测
    0.背景最近在做一个双屏游戏,一个场景中有两个摄像机,分别渲染到两个屏幕显示,然后在点击不同的屏幕时,要从不同的摄像机发射射线检测与场景中的物体交互。1.设置多屏unity中设置多屏的方式很简单,选中摄像机组件中的TargetDisplay属性即可。2.显式地激活连接的屏幕在确保连......
  • Unity中的自动布局组件
    列表的自动布局组件三个自动布局组件垂直、水平自动布局组件padding:偏移spacing:子节点下的间距childAlignment:子节点对齐方式ControlChildSize:控制子节点大小(常见于游戏道具)UseChildScale:是否考虑子对象的scaleChildForceExpand:子节点自动扩展格子自动布局组......
  • 【Unity】练习1—ROLL A BALL开发
    目录一、建立游戏环境1、创建一个新场景2、创建一个平面​编辑3、平面的缩放4、创建玩家对象5、调整光照6、用材质添加颜色二、玩家的移动1、给小球添加物理模拟组件2、安装输入系统InputSystem3、给小球添加玩家控制组件4、创建一个脚本5、写移动脚本三、镜......
  • 【推荐100个unity插件之24】Post Processing 后处理插件最全基础使用说明
    文章目录前言什么是后处理?场景视图显示后处理效果主相机勾选渲染后处理Post-processVolume和Volume的区别内置渲染管线的后处理Post-processVolume使用通用渲染管线(URP)的后处理是Volume的使用文档升级URPglobalvolume全局后处理效果泛光(Bloom)色差(Chromatic......
  • Unity Gyro Camera ---- 传感器控制摄像头旋转 + 正北校准 (纯原生支持Android+IOS,无需
    UnityGyroCamera传感器控制摄像头旋转+正北校准纯原生支持Android+IOS,无需安装ARKit,ARCore等插件这篇文章主要介绍如何利用手机原生的传感器,控制摄像头的旋转,最终可以实现AR或者VR的摄像头旋转控制问题提出 虽然,目前有一些用手机传感器控制虚拟摄像头旋转的方案......
  • Unity强化工程 之 Mask & SortingGroup
    本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正1.Mask遮罩故名思意就是起到遮挡作用的罩子:精灵遮罩-Unity手册如果我想让sprite与遮罩发生交互,那么我需要勾选spritrrenderer的交互选项之后就可......