这是有关控制角色移动的教程系列的第八部分。它增加了对攀爬垂直表面的支持。
本教程使用Unity 2019.2.21f1制作。它还使用ProBuilder软件包。
然后在EvaluateCollision中,如果一个接触点不算作地面,则分别检查陡峭接触和攀爬接触。始终使用攀爬触点连接的物体,这样我们的球体就有可能攀爬运动中的表面。
现在,我们假设我们能够自动爬升。要检查这一点,请添加一个Climbing
属性,该属性将返回true
是否有任何攀爬接触。
现在,我们需要在EvaluateCollision中检查碰撞的图层两次,因此将其存储在变量中。
然后,仅在未屏蔽的情况下包括攀爬接触。
获取对球体MeshRenderer
组件的引用,并将其存储在Awake的字段中。
然后在Update末尾为其分配适当的材料。
从现在开始,只要它碰到可攀爬的表面,球体就会变成红色。
在UpdateState
检查我们是否有地面接触时,首先调用此方法,因此攀爬否决其他所有规则。
为了防止跌倒,如果我们不攀爬,请在FixedUpdate施加重力。
直视墙壁时,此方法效果很好,但以其他角度查看墙壁时,其直观性会降低,因为控制方向无法完美对齐。例如,当按向右以笔直地走到墙壁上时,当触摸墙壁时,右将在视觉上变为向后,向前则向上。
最极端的情况是将视线从墙壁上移开,在这种情况下,左右控件会翻转。但这首先是一个尴尬的视角。这个想法是,当玩家准备好攀爬时,他会改变其视角。或者,可以将摄像机编程为自动执行此操作,但是在任意情况下都很难做到这一点,并且常常导致玩家感到沮丧。高级相机自动化不是本教程的一部分。
攀爬通常比跑步慢得多,并且还需要更精确的控制,因为轻微的失步会导致跌倒,无论是在现实生活中还是对于我们的地球而言。同样,放慢速度会使突然的控制方向切换更易于管理。因此,添加最大爬升速度和最大爬升加速度配置选项。我们希望低速和高加速度来实现最大控制,所以让我们使用2和20作为默认值。通常,您希望将速度保持在较低水平,但我将使用默认值的两倍进行快速测试。
哪个最大速度合适,可以随每个物理步骤而变化,这与更新循环不同步,因此我们再也无法确定Update中的所需速度。因此,注释该desiredVelocity字段
,将playerInput
变量提升为一个字段。
然后选择适当的加速度和速度,并在AdjustVelocity需要时计算所需的速度分量。
只要我们没有太快移动(或者如果动画的话,墙壁也不会太快),就可以使我们与墙壁保持联系,但会导致我们陷入90°的内角。我们可以通过稍微降低抓地力(例如最大加速度的90%)来避免这种情况,这只会使我们减速,而不再使我们停在内角。
尽管这可行,但抓地力加速度会减慢从墙壁上跳下来的速度。为了防止在刚跳下时关闭攀爬,就像关闭地面捕捉一样。我们可以通过使该Climbing
属性还检查自上次跳转以来是否已经超过两个步骤来实现。
请注意,需要相对于最大爬升速度的高最大爬升加速度才能可靠地附着在表面上。除此之外,速度不能太高,否则球体可能会在单个物理步骤中最终以太远的距离将其自身发射到离墙太远的地方。
现在,我们只应在EvaluateCollision检查是否需要攀爬即可。
但是,这还不足以防止球体在到达墙顶后可能自行发射。为此FixedUpdate
,如果我们不是在攀爬,而是希望并在地面上,我们还必须将攀爬抓地加速度与重力一起应用。
现在,我们可以可靠地从墙的顶部移动到墙壁的一侧,我们也可以可靠地进入一种情况,在这种情况下,我们正在前进以开始向下爬升,然后又切换为再次向上爬升。只要我们不断向前推进,就可以反复进行。这是我们的控制切换方法的缺点。最好的攀爬方法是将相机朝向墙壁。
每次我们在EvaluateCollision
累积正常爬坡时都进行设置。
然后CheckClimbing
确定是否有多个攀爬触点。如果是这样,请对爬升法线进行归一化处理,然后检查结果是否算作地面,这表明我们处在裂缝状态。要摆脱困境,只需使用最后的攀爬法线而不是合计值即可。这样,我们最终会爬上一堵墙,而不会卡住。
下一个教程是游泳。
声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。
原作者:Jasper Flick
原文:
https://catlikecoding.com/unity/tutorials/movement/climbing/
翻译、编辑、整理:MarsZhou
More:【微信公众号】 u3dnotes
本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。