【UE·GamePlay篇】攀爬系统系列教程(二)——相邻墙壁飞跃、墙角拐弯、回头反向跳

这一篇的内容对应视频教程:

工程地址:【github】UE4_ClimbSystem


飞跃到相邻墙壁的功能实现

在这里插入图片描述
在Tick里面增加飞跃检测,需要注意的是当左右移动的碰撞检测没有检测到墙壁才进行飞跃的检测,这样可以节省性能。
在这里插入图片描述
方法内部:
在这里插入图片描述
LeftLedgeArrow是角色的ArrowComponent,这个Component会在预览窗口显示箭头,实际运行是看不到的。当我们需要一些表示方向的变量时就可以使用这个组件,比直接使用FVector更直观一点。
在这里插入图片描述
接着回到跳跃键的回调函数,现在我们跳跃键已经有很多功能了

  • 平地普通跳跃(系统自带)
  • 悬挂时爬上边缘(上一篇文章)
  • 跳到相邻墙壁(方向键+跳跃)
  • 回头反向跳(后面会加入)

当功能复杂时,代码就容易混乱。先来看视频作者怎么做的:
在这里插入图片描述

  • 判断是否为悬挂,为false时进行普通跳跃
  • 悬挂时判断是否可以回头跳
  • 不可以回头跳时判断是否可以向右跳
  • 可以向右跳时判断玩家输入,右输入大于0,向右跳,否则爬上边缘
  • 不可以向右跳时判断是否可以向左跳
  • 可以向左跳时判断玩家输入,左输入大于0,向左跳,否则爬上边缘
  • 不可以向左跳时判断可以向上跳(这个功能因为实现太简单已经被我删了,所以不提了)

不知道你们什么感受,我当时跟着教程做的时候人已经麻了。这绝对是屎山的前兆。
在这里插入图片描述
如果功能再加几个,顺序再颠倒一下,比如现在想加一个按下+跳跃可以取消悬挂的功能。那维护这个代码真的是噩梦,稍微一不小心就可以漏掉几种可能性。作为有追求的游戏程序员,我们不能放任这种屎山存在。所以我对它进行重构,重构完之后是这样的:
在这里插入图片描述

  • 首先把跳跃的逻辑包装成方法
  • Sequence罗列多种可能
  • 满足情况A时走对应逻辑,然后return,这样就不会走下面所有逻辑
  • 将来如果添加新的状态,只需要Sequence再加一个输出引脚就可以了

这样写就很清晰,在进行飞跃检测的时候我不需要知道后面还有什么逻辑,反正我成功之后我就return了。我想改顺序也很方便,只要把Sequence的输出引脚换一下位置就可以了。

Bug记录

1、飞跃后位置不对
这是因为我们在飞跃过程中我们也进行悬挂检测,这样的话悬挂目标点会一直停在当前墙壁上,应该当我们飞跃到旁边的墙壁后再进行悬挂检测。
在这里插入图片描述
在HangTracer里面需要增加下面节点判断当前是否有在播放Montage(保险起见我们让播放Montage时都不进行悬挂检测):
在这里插入图片描述
2、飞跃后动画状态不正确
可以看到虽然我们位置正确了,但是动画不对。原因是播放Montage会打断当前动画机,而播放完成后会重新运行动画机,动画机的初始状态是Idle,如果缺少Idle到Hanging的转换条件就会出现这个Bug。上一篇文章我们不需要这个条件,因为上一篇文章用到Montage的地方是用在爬上边缘这个功能,而爬上边缘以后是回到Idle的。
在这里插入图片描述
在这里插入图片描述


墙角拐弯的功能实现

在这里插入图片描述

角色蓝图

在Tick里面增加墙角拐弯检测:
在这里插入图片描述
里面还是用碰撞检测判断是否是墙角,如果检测不到墙壁,说明是墙角。
在这里插入图片描述
有墙角的情况下按下A或者D播放Montage,播放完成后抓取边缘。
在这里插入图片描述


回头反向跳的功能实现

在这里插入图片描述
按下S键时对TurnedBack取反(回头状态),再判断是否是回头状态,如果不是,退出悬挂状态。按下W键取消回头状态。
在这里插入图片描述
把角色蓝图的TurnBack传到动画蓝图,在动画蓝图里增加TurnBack和TurnBackLoop状态。
在这里插入图片描述
然后在跳跃键回调方法里增加回头跳的功能:
在这里插入图片描述
使用LaunchCharacter节点给角色一个后上方的速度把角色发射出去,同时设置角色Rotation为当前Rotation绕Z轴转180度。


总结

到这里的话对这个系列教程UE4 Climb System - Tutorial的总结就写完了。本身视频就在一个小时左右,所以做的功能还是比较粗糙和简单的。但是可以提升不少UE的使用熟练度(比如播放Montage有三种方式我以前都不知道),还可以总结到很多在实战项目里一样会遇到的问题。比如按下一个按键要实现很多功能时代码容易很乱,或者是多种动画状态互相影响的问题(播A时不能播B,A播完以后要进入C状态,播C时又想要可以中断C进入D状态,诸如此类)。特别是动作游戏开发时,这类问题真的不要太多。
下一篇文章打算做别的攀爬功能。像这两篇实现的攀爬功能,都是基于悬挂边缘功能的扩展开发,主要是用于本身不能爬墙的游戏多一点(比如PUBG)。而如果能够自由爬墙(比如塞尔达、原神),没有所谓的悬挂功能,就又是另一套逻辑了。


关于作者

  • 我是水曜日鸡,一个爱好二次元的游戏程序员,大家都习惯叫我鸡佬。曾参与索尼中国之星项目《硬核机甲》的开发。 目前在某大厂做UE4项目。

欢迎来我建的群891809847一起聊游♂戏,我的群还蛮大的。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/j756915370/article/details/121310431