初学unity,感到各种各样的功能太多,每天打开b站都刷出一大堆不会的,所以在此记录每天学了什么。相关视频和参考文档一切权力归作者,侵删。
基本介绍
最近关注了一个up,他出了个讲Lerp的视频
https://www.bilibili.com/video/BV18T411P7hd?share_source=copy_web
https://blog.csdn.net/GG_and_DD/article/details/127195067
大概就是说,插值可以用来实现两种状态之间的逐渐变化过程,比如移动、变色、淡入淡出等。
Unity中有多个叫Lerp的函数,如Vector3.Lerp()、Vector2.Lerp()、Mathf.Lerp()、Material.Lerp()、Color.Lerp()等。(翻了翻手册,实际还有很多其他类似的或者有一些限制条件的插值)
up认为主要是场景不同,基本思想还是一致的,随后以向量插值为例演示了插值的用法。
个人认为基本都是这样一个格式
res=Lerp(start, end, scale)
也就是给一个起点,给一个终点,给一个比例,就能返回起点均匀变化到终点过程中某个比例的中间值。想要让物体的变化看起来是均匀的就只需要在每帧的时候取一下相应比例的值就可以看起来像是那样(因为人眼暂留效应)。
用法
1.刚才说过,只要是涉及渐变效果的,都可以用,只要在每帧刷新的时候求出当前时间对应的插值然后赋给要变化的对象即可。在这个过程中,其实函数的前两个参数是不变的,所以提前就要确定变化的起始状态、结束状态。然后建立一个计时器用来记录当前的比例(也就是已经消耗的时间)。还要确定总时间。
在Start中把起始状态赋予对象,每次update的时候,求计时器+=Time.deltaTime(本帧消耗的时间),把Lerp(start, end, 计时器)赋予对象即可
当然,要注意边界情况,如果计时器+=Time.deltaTime之后超出总时间,就直接把最终状态赋予对象就可以了。
2.可以实现平滑的变化吗?这里指的是快到结束状态的时候会减小变化速度缓慢结束的情况。视频的up认为这样的Lerp实际上是通过不断把当前状态设为新的起始状态实现的,不是线性的变化,并不好,建议用SmoothDamp()方法。(据说,那也是早期unity官方演示的一种用法)
其实可以理解,毕竟“一尺之棰,日取其半,万世不竭”,换句话说就是:
3.多段运动,直接拆开处理就好。
相关概念
LerpUnclamped()
之前看到这个单词还是在某动漫里……意思是非钳制插值,简单地说就是允许插值的第三个参数超出0到1的范围限制。
所以说,之前没想过的一点是,普通的Lerp函数里如果输入了超出限制的第三参数会自动帮忙处理成合适的值