👨💻个人主页:@元宇宙-秩沅
hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 秩沅 原创
收录于专栏 [unity常用API]
⭐相关文章:基础不牢,地动山摇系列 ------ 软硬通吃 unity常用API
⭐相关文章:关于游戏剧情模式中用到的基础简单API
⭐相关文章:控制游戏人物移动的细节到底有多少?
⭐相关文章:坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
⭐基于unity实现物体移动与模拟刹车的细节处理⭐
文章目录
- ⭐基于unity实现物体移动与模拟刹车的细节处理⭐
- 👨💻Lerp(a,b,t) 限制性差值
- 👨💻MoveTowards(a,b,t) 匀速步频
- 👨💻LerpUnclamped(a,b,t)非限制差值
- 👨💻smoothDamp(a,b,v,t)平滑阻尼
- 👨💻结论
所有线性有关的差值函数都运用到物体移动的情况,以下四种是常见且重要的API,他们的区别和用法详解如下。这里主要以二维向量为例子,三维以此类推。
如图: a点物体到b点物体用差值函数进行移动
👨💻Lerp(a,b,t) 限制性差值
文档:Lerp(a,b,t) 限制性差值
gameObject.transform.position = Vector2.Lerp(a.position,b.position ,speed);
- 场景应用实现:
可以看出使用lerp()用到物体运动身上并不是匀速的,因为此时每一次差值完之后,都是用差值完后的两点距离再进行差值、
- 向量含义图:
图中的黑点就是又无数个任意取差值的点 ,范围为(0,1)
- 应用示意图:
按照差值进行移动,但只只进行一次,所以将其放在update函数里面,实现作用于a向b点移动
如果此时要让其变成匀速只需要让其加上前一次差值过的数值,即可实现匀速移动
speed += persent * Time.deltaTime;
gameObject.transform.position = Vector2.Lerp(a.position,b.position ,speed);
- 修改代码后的效果图:
👨💻MoveTowards(a,b,t) 匀速步频
文档:MoveTowards(a,b,t)
- 相比上面MoveToward 也是匀速运动用到较多的函数,并且相较于上面大家可以直接使用movetowards 进行物体的匀速运动
- 此时的t 作为步频,也可以理解为移动的频率
- 效果图:
在这里当然我将速度从0.01改成了0.05,但是匀速效果还是显而易见的,只是由于电脑原因导致了一下卡帧
👨💻LerpUnclamped(a,b,t)非限制差值
文档:LerpUnclamped(a,b,t)
- 此时就是非限制性差值了,也就是说我们的t可以随便取值,不再是0到1范围内取值,这就意味着它的差值会超过两点本身的距离
- 向量图:
- 效果图:
gameObject.transform.position = Vector2.LerpUnclamped (a.position,b.position ,speed);
此时我将 t 变为1.3 ,这时可以看到物体A 超出了B,原因是差值超过两点本身的距离,之后又和B重合
👨💻smoothDamp(a,b,v,t)平滑阻尼
文档:smoothDamp(a,b,v,t)
- 平滑阻尼,应用于汽车刹车,想象一下汽车刹车,特别是速度快的是不是还要向前摩擦行驶才停下来,效果就是如此
- v 是速度 ,t 是平滑时间
Vector2 vority = new Vector2(0.1f, 0);
gameObject.transform.position = Vector2.SmoothDamp(a.position,b.position, ref vority ,speed); 、
- 我将阻尼时间 t = 设为0.1 的效果图
可以看到阻尼效果
- 我将阻尼时间 t = 设为0.5 的效果图
可以看到阻尼时间越长越慢
- 我将阻尼时间 t = 设为0 的效果图
可以看到丝毫没有阻尼效果
👨💻结论
- 👍Lerp () 先慢后快
- 👍moveTowards ()匀速
- 👍smoothDamp() 模拟制动系统
⭐相关文章:基础不牢,地动山摇系列 ------ 软硬通吃 unity常用API
⭐相关文章:关于游戏剧情模式中用到的基础简单API
⭐相关文章:控制游戏人物移动的细节到底有多少?
⭐相关文章:坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!