在这个非常简短的 Unity 2D 编程教程中,我将向你展示如何让相机以轻微延迟的方式跟随主角,而不是立即跟随,从而实现更平滑的过渡效果。
本教程的视频版本目前尚未提供该语言版本。
视频文字稿
大家好!在这个非常简短的 Unity 2D 编程教程中,我将向你展示如何让相机以轻微延迟的方式跟随主角,而不是立即跟随,从而实现更平滑的过渡效果。
本教程适合已经熟悉 Unity 中 Delta Time 概念,并且可能了解过 Slerp 等插值方法的学习者。我已经在其他基础教程中介绍过这些概念,你可以在频道中的英文视频版本里找到,也可以在我的网站上查看多语言的文字版本。
在我将要展示的示例中,为了简化说明,我只编写沿 X 轴移动的代码,不过同样可以很容易扩展到沿 Y 轴的垂直移动。

我们从基础脚本开始,这个脚本将相机的位置约束为跟随角色的位置。该脚本在这里命名为 Camera Controller,其中首先定义了一个 Transform 类型的 private 变量,需要在编辑器中分配为要跟随的对象,以便获取其位置。
在 Update 函数中,我们有一个 float 类型的变量用于获取玩家位置的 X 坐标,并将其用于相机位置中的 Camera X 数值,以替代相机自身的 X 坐标,这样相机就可以立即跟随角色。
我们尝试的第一种变化是使用 Lerp,因此我引入一个名为 Follow Time 的 float 类型 private 变量,可以在编辑器中进行调节。在 Update 函数中,我使用选项 2 来定义相机的 X 坐标,现在该坐标由 Lerp 函数的结果给出。
Lerp 是 Unity 的原生函数,用于在对象当前位置 Transform Position 与目标位置 Player Position 之间执行线性插值。插值参数由 Delta Time 与 Follow Time 变量之间的比值表示,这使你可以控制相机逐步接近目标位置的速度,并且也可以在运行过程中通过编辑器方便地调整该行为。
使用 Lerp 函数时,在每一帧中相机会更新自身位置,并逐步接近目标位置。这样,与瞬间位移相比,相机运动看起来不那么突兀。不过,Lerp 执行的是线性插值,在接近目标位置时不会对速度进行阻尼,这可能使接近阶段的运动显得不够自然。为了获得更平滑的过渡效果,可以使用 Smooth Damp 方法。
接下来我再添加两个新变量,分别叫做 Smooth Time 和 Velocity。其中 Smooth Time 是一个 float 类型的 private 变量,用于调节插值效果,类似于在使用 Lerp 时的 Follow Time。Velocity 也是一个 float 变量,用于传递给 Smooth Damp 方法,在运行过程中存储当前速度。
原生的 Smooth Damp 方法可以实现一种更加平滑、带阻尼效果的运动方式,当相机接近目标位置时速度会逐渐降低。Velocity 变量表示相机在所考虑轴方向上的当前速度。Velocity 通过引用方式传递给该方法,并在插值过程中每一帧自动更新。
在代码中,相机的 X 坐标现在由 Smooth Damp 执行插值计算得到。从概念上来说它与 Lerp 类似,因为它同样是在两个数值之间进行插值,但它能够产生更平滑的过渡效果,并且在方法签名中还使用了 float 类型变量 Velocity。
Smooth Damp 可以看作是 Lerp 的一种进阶版本,它引入了逐步的速度阻尼,使运动更加自然。
好了,本期视频就到这里!如果你觉得这个教程对你有帮助,可以点个 Like 并订阅频道支持一下。我们下次再见!