SmoothDamp的使用方法与Lerp的解析解析

SmoothDamp的使用方法与Lerp的解析解析

SmoothDamp 的效果与第一次使用 Lerp 产生的效果类似。 如果作用于位移,它会缓慢减速到达目标位置。 顾名思义,Damp(阻尼)就像是因为阻力而减速,而这个功能和 Lerp 的区别就在于它的 Smooth(平滑度),因为它的内部实现是轮毂大师无数次调整参数得到的值。 与Lerp简单粗暴的插值相比,在性能上看起来更好。 相当多,所以一般如果用于相机平滑,我们会使用SmoothDamp。

效果图.gif

2.2 函数原型

公共静态浮点SmoothDamp(浮点当前技能特效,浮点目标,参考浮点当前速度,浮点smoothTime,浮点最大速度);

参数分析:

current:需要更改的参数的当前值。 一般放在update中,传入每一帧的当前值。

目标:目标值。

currentVelocity:函数移动目标的最大速度。 这个所谓的速度代表Unity中对象每秒移动多少个单位。 需要注意的是:首先unity数值平滑变化像素游戏素材,传递参数时记得加上ref关键字,因为SmoothDamp会在内部更新这个值并传递出去。 其次,这个传入参数的生命周期需要比SmoothDamp更长unity数值平滑变化,因为SmoothDamp内部会根据上面计算出的一次速度来更新下一个位置。 简单的方法就是将这个传入参数设置为全局变量。

smoothTime:平滑时间,但是经过我的实际测量,这个时间并不准确,有一些陷阱。 我希望有人能回答这个问题。

maxSpeed:作用物体的最大速度。

2.3 使用方法

使用方法与Lerp的第二种使用方法类似。 只需在 Update 中调用即可。 但需要注意的是,需要传入的是电流值,而不是一个常量值。

    public float vel;
    // Update is called once per frame
    void Update()
    {
        float x = Mathf.SmoothDamp(transform.position.x, 10, ref vel, 1);
        //注释部分用作速度测试
        // float lastX = transform.position.x;
        // Debug.Log("Vel:" + (x - lastX) / Time.deltaTime);
        Vector3 updatePos = new Vector3(x, 0, 0);
        transform.position = updatePos;
    }

可以看到,上面的代码中,我将每一帧中物体的x坐标传入到当前参数中,然后更新每一帧中物体的位置,这样就可以实现平滑到达了!

文章来源:https://www.jianshu.com/p/650e5ff6402c