可能很多人会用到Verctor3.Lerp、Mathf.LerpUnclamped等等
这种其实不是匀速
看一下这个整体差不多的逻辑
public static float Lerp(float a, float b, float t)
{
return a + (b - a) * t;
};
这个逻辑就是,从a值到b值,返回一个a值加(b值-a值)百分比t的值给你。。。写完发现有点白给。
如果不理解我举个例子
我在原点出发,我坐标是a = 0,我要去 b = 10米的地方(终点)
t值是1
代入公式 (b - a) * t 《转换到右边》 (10-0)*1 = 10米
然后就是 a + (b - a) *t 《转换到右边》 0+10 = 10米
结果返回10 = b,我瞬移到了终点(结束)
t值是0.5f
代入公式 (b - a) *t 《转换到右边》(10-0)*0.5f = 5米
然后就是 a + (b - a) *t 《转换到右边》 0+5 = 5米
结果返回5 != b,此时我的a变成5,第二帧继续下面(为什么a变成5,不知道的翻到最底下的扩展)
代入公式 (b - a) *t 《转换到右边》(10-5)*0.5f = 2.5米
然后就是 a + (b - a) *t 《转换到右边》 5+2.5 = 7.5米
结果返回7.5 != b,此时我的a变成7.5,第三帧继续下面
代入公式 (b - a) *t 《转换到右边》(10-7.5)*0.5f = 1.25米
然后就是 a + (b - a) *t 《转换到右边》 7.5+1.25= 8.75米
结果返回8.75 != b,此时我的a变成8.75,第四帧继续,a会一直逼近b=10的值
这能理解了吧,如果还不能理解就再看多几遍
如果还看多几遍还看不懂就评论区告诉我哦 ^ _ ^(你敢,我四十米的)
t值是0
代入公式 (b - a) *t 《转换到右边》(10-0)*0 = 0米
得到的永远是0,所以不会变化
扩展:为什么a变成5,你可以理解成是一个迭代的方法,如下
public void Lerp(ref float a, float b, float t)
{
a = a + (b - a) * t;
if(a!=b)
{
Lerp(ref a,b,t);
}
}
好了,学了上面这个的Lerp的原理,我们就可以吃正餐了
实现匀速变化值的方法,或者匀速移动的方法
1、自己写一个协程,定义个时间或者每次变化的插值
2、用dotween,我就是为了讲这个
这个是官方的方法,如果不会可以参照我下面的代码
我用DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);来做实战例子
RightBtn.onClick.AddListener(() =>
{
if (CurrentPage > 0)
{
CurrentPage--;//页数(我这里做的是一个匀速翻页的功能)
targetNormalizedPosition = CurrentPage / (Pages - 1f);//目标点
DOTween.To(()=> scrollrect.horizontalNormalizedPosition, x =>
{
scrollrect.horizontalNormalizedPosition = x;//这里将x的值 赋值 到我要移动的scrollrect组件 的坐标上
}, targetNormalizedPosition, 1);
}
});
对比DOTween.To(()=> myFloat, x=> {myFloat = x}, 52, 1);
简化DOTween.To(()=> 目标值, x=> {实现逻辑}, 终值, 时间);
还有不理解在评论区说一下哦