UE5实训:地铁跑酷游戏开发全解析
由于后期需要生成无限地图和障碍物的生成,所以角色需要始终向前奔跑,需要固定角色z轴的值,保持与世界坐标轴一致,在测试时,用一块地面测试,发现角色的Y值会因为偏差导致角色未到达指定生成障碍物的路面(限制在Y轴上的运动),从而交互失败,所以新建一个浮点型变量TargetY直接固定角色在世界场景中的Y值插值到新获取的Actor位置,其他两个坐标轴与原先保持一致。可以发现,角色玩家移动的逻辑在Y,Z的轴向
一、实训的目的与要求
1.1 目的
通过本实训,基于UE5开发环境,使用蓝图语言,充分使用和综合运用《虚拟现实引擎开发》课程的所学内容,完成基于UE5在PC端的简单游戏的需求分析、设计和实现,掌握游戏的设计步骤和基本的开发流程。培养学生分析和解决问题的能力,增强学生在实践中的动手能力。
1.2 要求
- 掌握基础知识与操作技巧
学生需要了解虚幻引擎的基本架构、界面布局、项目结构以及核心组件。掌握在虚幻引擎中创建、编辑和管理场景的技能,包括地形编辑、静态网格体放置、光源设置等技巧。 - 熟练使用工具与技术
学生需要掌握虚幻引擎中的材质编辑器、蓝图系统、序列器、动画系统等工具的使用方法。同时,学生需要了解光照与渲染技术的原理,并能够熟练应用。 - 完成项目实训
学生需要通过实际项目实训,完成从场景搭建、材质应用、光照设置到最终导出的全过程。实训过程中,学生将按照企业指导老师的要求完成各项任务,确保作品质量。 - 理论与实践相结合
实训强调理论与实践相结合,学生不仅需要学习虚幻引擎的理论知识,还需要通过动手实践来加深理解。例如,学生需要通过案例分析和项目实践,了解行业前沿技术和设计理念。 - 持续学习与适应新技术
实训要求学生具备持续学习和适应新技术的能力。随着虚幻引擎技术的不断发展,学生需要不断更新自己的知识体系,以适应行业变化。
二、实训准备
1. 软件安装与配置
- 安装虚幻引擎:确保学生已安装最新版本的虚幻引擎(UE4或UE5),并熟悉其安装路径和启动方式。
- 安装必要的插件:根据实训内容,安装如“Lumen”、“Nanite”、“Sequencer”、“Material Graph”等插件。
2. 学习资料与文档准备
- 教材与课程资料:学生应提前阅读相关教材或课程资料,了解实训的基本内容和要求。
- 官方文档与教程:熟悉虚幻引擎的官方文档、官方教程和社区资源,为实训提供理论支持。
- 参考案例与模板:提前研究实训案例,了解项目结构、场景搭建方式、材质设置等。
3.项目理解与目标明确
- 明确实训目标:了解实训的具体任务和要求,如场景搭建、动画制作、粒子特效等。
- 理解项目流程:了解从需求分析、场景设计、模型导入、材质设置、动画制作到最终导出的完整流程。
- 制定学习计划:根据实训内容,合理安排学习时间,确保按时完成任务。
2.1工具准备
本选择:根据实训内容选择虚幻5
安装路径:确保安装路径清晰,便于后续使用。
插件安装:根据实训内容安装必要的插件,如:
Lumen(全局光照)
Nanite(高精度几何)
Sequencer(动画序列)
Material Graph(材质编辑)
Blueprints(蓝图系统)

图2、图3为项目文件夹

从虚幻引擎中下载本次实训所需要的素材,导入素材AsstsvileTown在之后的项目中的模型选取中会有参与使用
2.2知识准备
(正文为宋体,五号字 行间距为21)
- 熟悉虚幻引擎界面:了解主界面、内容浏览器、场景视图、细节视图等主要功能区域。
- 掌握基本操作:如创建新项目、导入模型、设置相机、调整灯光等。
- 了解材质与光照系统:熟悉材质编辑器、材质蓝图、光照设置(如方向光、点光、聚光)等。
三、实训总体设计及思路
3.1总体设计
- 创建项目
- 导入素材
- Gameplay
- 添加相机
- 创建增强输入系统
- 设置角色移动逻辑和跳跃逻辑
- 创建角色动画蓝图
- 创建地面及其循环生成
- 创建障碍物生成逻辑和障碍物数组
- 更新角色移动速度
- 设置金币生成和逻辑
- 创建敌人
- 设置建筑数组
- 角色下滑逻辑
- 优化环境迷雾
3.2开发背景
技术革新:UE5的发布标志着游戏开发进入了一个全新的时代。Lumen和Nanite等技术的普及,使得开发者可以更轻松地实现高质量的游戏和应用。这些技术不仅适用于游戏开发,还广泛应用于影视制作、建筑可视化、虚拟现实(VR)和军事模拟等领域。
行业影响:UE5的开源特性(通过GitHub平台)为开发者提供了更多的自由度和创新空间。开发者可以深入研究引擎的内部工作原理,并进行自定义和改进,从而推动游戏和虚拟现实技术的发展。
玩家体验:UE5的高画质和真实物理效果,使得玩家在地铁跑酷游戏中能够获得更加沉浸式的体验。例如,油管博主TeaserPlay使用UE5重新制作了经典游戏《地铁跑酷》,其逼真的写实风格让玩家大为惊叹,引发了网友们的热烈反
四、系统分析
4.1模型选取依据
需要实现类似于地铁酷跑的游戏,保持电脑的性能运行,所以选取低精度的3D模型
提高资源的可用性和尽可能的降低成本。
模型的选取还需要考虑其与虚幻引擎5的兼容性。
模型的选取还应考虑游戏的整体创意和艺术风格。
4.2系统功能分析
(正文为宋体,五号字 行间距为21 )
无尽跑酷机制:游戏的核心机制是“无尽跑酷”,玩家在地铁轨道上不断奔跑,躲避障碍物(如广告牌、障碍物等),并收集金币。这一机制需要通过蓝图系统实现,包括游戏循环、角色移动、障碍物生成和收集逻辑。
动态难度调整:随着游戏进行,障碍物的速度和密度会逐渐增加,以保持玩家的挑战性。这一机制可以通过蓝图中的变量和函数来实现。
角色移动:玩家通过滑动屏幕控制角色的左右移动,跳跃和蹲下功能可以通过蓝图中的事件图实现。例如,当玩家按下跳跃键时,角色会触发跳跃动画。
动画系统:角色的动画可以通过动画蓝图(Animation Blueprint)进行管理,确保角色动作流畅自然。动画蓝图可以与角色的移动状态同步,实现更真实的动画效果。
物理模拟:角色的跳跃和碰撞检测依赖于虚幻引擎的物理引擎,确保角色在空中和地面的运动符合现实物理规律。
障碍物生成:障碍物(如广告牌、障碍物等)需要在游戏过程中动态生成。可以通过蓝图中的数组和随机生成机制实现,确保障碍物的分布合理且具有挑战性。
敌人AI:虽然地铁跑酷游戏通常没有敌人,但可以引入简单的敌人AI,如巡逻的机器人或追逐玩家的敌人,以增加游戏的挑战性。
HUD设计:游戏的用户界面(HUD)包括跑步距离、金币数量等信息。通过虚幻引擎的UI系统,可以创建自定义的HUD元素,并根据游戏状态进行动态更新。
五、系统实现
5.1UI界面设计

图3、UI界面
如图所示,左侧UI为角色拾取金币的个数,右侧为角色从玩家出生点位置起一直保持向前移动的距离(即分数)设计蓝图如下:

图4、UI相关的蓝图编写
距离计算
右击鼠标获取玩家对象,将需要计算金币和数量的角色父类BP_Runer拖入蓝图中,作为计算对象,引用BP_Runer角色产生移动距离的浮点型变量,脱出引脚,连接转换为文本(浮点型)并格式化文本,在format中输入{Distance}m,这样可以保持距离单位不变而距离值为数组集合。
金币获取
金币获取同距离计算,需要将BP_Runer中的CoinsNumber变量替换距离计算中的Distance
事件运行
距离计算和金币获取为游戏中一直计算的两个变量,因此需要使用事件Tick并连接两个变量的设置文本,将文本变化引入事件。
5.2场景模型

图5、BP_Plant模型蓝图
图为基础的场景模型,由于游戏的需要,添加相应的障碍数组和环境无限生成数组(具体交互见蓝图)

图6、汽车障碍物模型

图7、街道障碍物模型数组

图8、建筑模型数组
5.3角色模型(水晶、大炮)

图9、BP_Runner的模型蓝图
图中带蓝色箭头的胶囊体模型为玩家角色,其次就是AI追击的敌人

图10、金币模型
5.4蓝图脚本
5.4.1完成GamePlay蓝图设置
创建蓝图类游戏模式基础,创建完成后将蓝图重命名为MyGameMode,相当于本局游戏的设置,如玩家的选择,控制和状态等等。

图11、GmaeMode的游戏模式蓝图

图12、GameMode相关设置
更改下列设置,并在地图和游戏模式中进行运用

图13、模式设置
5.4.2添加摄像机

图14、添加摄像机和弹簧臂
创建摄像机和弹簧臂,AI角色与角色大同小异,AI角色的弹簧臂是相较于角色而言,后期会涉及到AI角色追击以及延迟出现,所以不能与摄像机连接,否则会使视口偏移。
5.4.3创建增强输入系统

图15、增强输入数据资产
创建这四个输入系统,分别为下滑(s),跳跃(空格),摄像机视角偏移(鼠标两轴),角色移动(AD)。创建完成后,添加输入映射上下文,这个是通过键盘或鼠标来控制角色的行为和状态。
图16、增强输入的输入映射(实现)
图为移动时的键位设置,方向相反时,需要添加否定的修改器,后期因涉及到角色动画,需要将输入操作中的轴向进行调换(S下滑键),在下滑时角色的x轴与y轴会产生互换,所以还需要添加版和输入轴值。自此,角色输入操作就完成了。
5.4.4设置角色移动逻辑和跳跃逻辑

图17、角色激活
先进行角色激活,获取控制玩家在本地场景中的相关设置,检查玩家控制器是否被实例化后接入相关的输入映射操作。

图18、移动操作
上图为移动操作及视角移动操作,将角色的XY轴方向上的数值赋予角色移动,由于游戏的交互是保持向前移动和左右移动规避障碍,将移动产生的坐标插值转化成世界场景的距离和旋转。

图19、视角移动
视角移动Y轴的移动为pitch,x轴移动为yaw,z轴为roll(本次交互不需要)

图20、角色始终向前奔跑
角色始终向前奔跑:由于后期需要生成无限地图和障碍物的生成,所以角色需要始终向前奔跑,需要固定角色z轴的值,保持与世界坐标轴一致,在测试时,用一块地面测试,发现角色的Y值会因为偏差导致角色未到达指定生成障碍物的路面(限制在Y轴上的运动),从而交互失败,所以新建一个浮点型变量TargetY直接固定角色在世界场景中的Y值插值到新获取的Actor位置,其他两个坐标轴与原先保持一致。(测试:获取旋转和向前向量的坐标轴全部连接,对交互并无影响,所以可以全部连接)

图21、获取玩家移动的距离值
获取玩家移动的距离值,初始位置的X轴与变化的距离向量一致,默认初始坐标为(200,1200,110)则以X轴为基准,距离向量的坐标为(0,1200,110),换算相应单位米。将数值设置到Distance(距离)中。

图22、控制角色左右移动
控制角色左右移动,需先判定是否按下D键,因为输入操作,操作类型为布尔,且按一下D只执行1次,获取角色位置之后,将四段道路的左右移动落点(近似值)分别为(0,2250,0), (0,1450,0) (0,950,0) (0,150,0),按下D键后将执行以下Y轴的位移变化操作。

图23、控制角色左右移动
角色向右移动与上述操作大同小异,为了方便操作,将方向以-1与向左操作区别

图24、与角色向右移动保持相反

图25、、角色跳跃逻辑
角色跳跃逻辑,设置胶囊体半高(或在角色视口中设置),新建布尔变量是否下滑,判定跳跃的开始和结束,跳跃距离。
5.4.5创建角色的动画蓝图

图26、动画蓝图搭桥
角色相应的动画,为避免在跳跃时误触下滑键,新建isFalling布尔变量判定角色是否下滑。

图27、判定角色下滑

图28.判定角色下滑
5.4.6地面循环生成蓝图
在MyGameMode的蓝图中,新建函数AddPlant

图29、自动生成地面蓝图
新建变量LastPlantIndex(来表示最终的地面数量),创建在X方向上的原来的地面800m处地面自行生成并以1为单位进行累加,为减少资源损耗和资源损耗,后期会进行短时间内消除

图30、虚幻播放生成地面的蓝图
利用for loop函数循环生成上述函数的行为,要以第一块作为基准,故不删除,为方标看清前面的障碍物,需要将循环4次

图31、地形延迟销毁蓝图
5.4.7创建障碍物生成逻辑和障碍物数组
要生成障碍物逻辑就需要新建多个静态网格体,这时就需要用到数组来封装和存储这几类数据,我们生成的障碍物主要分为马路障碍物,人行道障碍物,以及房屋建筑。(见图6、7、8)由于需要跟随地面BP_Plant随机生成所以我们需要添加车辆、障碍物和建筑的变量,分别为SideWalkMeshs,StreetMeshs,StreetMeshs用于后续操作,由于前面进行角色左右移动时候我们将马路分为了四段(静态网格体初始值为空),本次交互我们将继续使用。

图32、用于存放数组变量的四段静态网格体

图33、汽车移动逻辑
获取汽车移动的逻辑,是的汽车更加生动,游戏更加立体

图34、随机生成障碍物的概率蓝图
判定是否生成障碍物后进行概率分布通过改变weight可以调整后面数组出现的概率添加序列包含所有的数组序列,如下图:

图35、控制障碍物随机生成
5.4.8更新角色移动速度
为了增加游戏的趣味性和难度,可以实时更新角色的的速度,以每秒0.05的加速度设置其实时更新的速度大小,并限制其最大值为30m。
图36、更新角色的移动速度
5.4.9金币生成逻辑
与前面相同,在做交互时,需要用一个新的变量来方便定义逻辑的生成,关于收集金币,我们以CoinNumber(整形)来表示金币的数量。

图37、金币生成逻辑
新建函数为金币收集,判定是否生成Coins,若为真,则设置金币的生成参数为范围内最多重叠3个,测试时防止从马路下掉落,让玩家更醒目的看到金币,需要在角色可移动坐标范围重复生成金币,将Z轴在世界场景中偏移80个点位在进行更新金币的位置。

图38、金币获取得分机制(销毁)
金币销毁的两种情况,一种是被玩家拾取并完成,还有一种情况随着BP_Plant消失而消失(见BP_Plant中SpawnCoins行为函数)。
5.4.10创建敌人
为了增加游戏难度和趣味性,需要创建敌人AI在玩家触碰到障碍物时,我们需要AI迟缓出现并对玩家进行追击,在玩家脱离触碰障碍物5s后,AI延缓消失。反之,在此时间内,玩家若连续触碰障碍物两次时,AI将抓取玩家(游戏交互为重叠)

图39、敌人追击时的缓动效果
可以发现,角色玩家移动的逻辑在Y,Z的轴向上AI的逻辑蓝图是一样的,这样就可以使两者在游戏中可以做到动画一致,但是速度却不一样。分为两种情况:其一,是玩家为满足抓取条件,其二是玩家被抓取,AI的速度是不一样的。所以就需要更新在AI与玩家间的弹簧臂长度。我们将玩家被抓取的次数设置成变量,方便条件的判定。

图40、角色抓取函数蓝图 
图41、更新敌人弹簧臂长度的部分蓝图
接着前言,阐述了玩家抓取的机制,由于玩家满足被抓取的所有条件则需要判定当AI与玩家重叠时游戏自动退出,否则AI缓慢推出摄像机视角。
创建建筑群数组
建筑群数组的添加与障碍物大同小异,具体可参照前文,以下主要展示建筑群数组蓝图的逻辑生成

图42、建筑群数组的逻辑生成
5.4.11角色下滑逻辑

图43、角色下滑逻辑
5.5音频设计

图44、场景音效蓝图

图45、拾取金币时播放音效
在添加音效时若循环播放会出现2D音效逐帧循环的情况,而使用DoOnce的情况绘制播放一遍,所以应该放弃在蓝图中放置音效的想法,转而应该直接拖入,双击音效,设置为随机循环播放场景音效,金币则不需要,在发生胶囊体碰撞时,使用DoOnce函数,只播放一次音效,在使用布尔变量设置触发即可,至此音效制作就完成了
、
六、遇到的问题和解决方法
1. 蓝图事件图逻辑混乱
问题描述:在开发过程中,蓝图事件图的逻辑可能变得复杂,导致难以追踪和调试。例如,角色移动、跳跃、碰撞检测等逻辑可能交织在一起,导致程序运行不稳定或出现错误。
解决方法:
- 使用蓝图构造脚本(Blueprint Construction Script)来初始化角色的默认行为,确保角色在游戏开始时能够正确加载动画和状态。
- 利用事件调度器(Event Dispatcher)或函数调用(Function Call)来组织事件流程,避免事件图过于复杂。
- 使用调试工具(如调试器或日志输出)来跟踪事件图的执行路径,确保每个节点的输入输出正确无误。
2. 角色控制与动画同步问题
问题描述:在《地铁跑酷》中,角色的移动和跳跃需要与动画同步,否则会出现角色动作不连贯或动画播放错误的情况。
解决方法:
- 使用动画蓝图(Animation Blueprint)来控制角色的动画状态,确保动画与角色的移动和跳跃动作同步。
- 在蓝图中添加动画蒙太奇(Animation Montage)节点,用于播放特定的动画序列,如跳跃、蹲下等动作。
- 使用动画状态机(Animation State Machine)来管理不同动画状态之间的切换,确保动画流畅过渡。
3. 障碍物与列车的移动逻辑
问题描述:在《地铁跑酷》中,障碍物和列车的移动是游戏的核心机制之一。如果移动逻辑不正确,可能会导致障碍物无法正确移动或与角色碰撞检测失败。
解决方法:
- 使用蓝图类(Blueprint Class)创建障碍物和列车的蓝图,确保每个障碍物都有独立的移动逻辑。
- 在蓝图中添加时间线动画(Timeline)节点,用于控制障碍物的移动路径和速度。
- 使用触发体积(Trigger Volume)来检测角色与障碍物的碰撞,并在碰撞时触发相应的事件(如游戏结束或得分增加)。
问题描述:在《地铁跑酷》中,用户界面(UI)和HUD(Heads-Up Display)是游戏的重要组成部分。如果UI布局不合理或响应不及时,会影响玩家的游戏体验。
解决方法:
- 使用 UMG(Unreal Motion Graphics) 来创建用户界面,确保UI元素
能够正确显示和更新。
问题描述:在《地铁跑酷》中,地图的生成和布局是游戏的重要组成部分。如果地图设计不合理,可能会导致玩家体验不佳或游戏机制失效。
解决方法:
- 使用蓝图脚本来生成地图,确保地图的随机性和多样性。
- 使用程序化生成(Procedural Generation)技术来创建动态地图,确保每次游戏都有不同的体验。
- 使用蓝图构造脚本来初始化地图,确保地图元素(如障碍物、金币等)正确放置。
4. 声音与音效设计
问题描述:在《地铁跑酷》中,音效和背景音乐是增强游戏沉浸感的重要元素。如果音效设计不合理,可能会导致玩家体验下降。
解决方法:
- 使用蓝图事件图来触发音效播放,例如在角色跳跃时播放跳跃音效。
- 使用音效蓝图(Sound Blueprint)来管理音效的播放和停止。
- 使用音效混合器(Sound Mixer)来调整音效的音量和平衡,确保音效清晰可听.
七、心得体会
在《地铁跑酷》中,障碍物和列车的移动是游戏的核心机制之一。通过使用蓝图类(Blueprint Class)创建障碍物和列车的蓝图,可以确保每个障碍物都有独立的移动逻辑。在蓝图中添加时间线动画(Timeline)节点,可以用于控制障碍物的移动路径和速度。此外,使用触发体积(Trigger Volume)来检测角色与障碍物的碰撞,并在碰撞时触发相应的事件,可以确保游戏机制的正确运行。
5. 用户界面(UI)与HUD的实现
用户界面(UI)和HUD(Heads-Up Display)是游戏的重要组成部分。通过使用UMG(Unreal Motion Graphics)来创建用户界面,可以确保UI元素(如得分、距离等)能够正确显示和更新。在蓝图中添加UMG控件,并绑定变量以实现数据的动态更新,可以确保UI的响应性和实时性。
6. 性能优化与资源管理
在开发过程中,由于蓝图的可视化编程特性,可能会导致性能问题,尤其是在处理大量动态对象(如障碍物、列车)时。通过使用蓝图优化技巧,如减少不必要的节点调用、使用缓存变量等,可以提高性能。此外,对于静态网格和材质,使用Lumen实时全局光照和Nanite来优化渲染性能,可以确保游戏在不同硬件设备上的良好表现。
7. 蓝图与C++代码的集成
在某些情况下,开发者可能需要将蓝图与C++代码结合使用,以实现更复杂的逻辑或性能优化。通过使用蓝图接口(Blueprint Interface)来定义蓝图与C++代码之间的交互方式,可以确保函数的参数和返回值类型正确。此外,使用蓝图编译器(Blueprint Compiler)将蓝图编译为C++代码,可以提高执行效率。
8. 关卡设计与地图生成
在《地铁跑酷》中,地图的生成和布局是游戏的重要组成部分。通过使用蓝图脚本来生成地图,可以确保地图的随机性和多样性。使用程序化生成(Procedural Generation)技术来创建动态地图,可以确保每次游戏都有不同的体验。此外,使用蓝图构造脚本来初始化地图,可以确保地图元素(如障碍物、列车、金币等)正确放置。
9. 声音与音效设计
在《地铁跑酷》中,音效和背景音乐是增强游戏沉浸感的重要元素。通过使用蓝图事件图来触发音效播放,例如在角色跳跃时播放跳跃音效,可以确保音效的正确播放。使用音效蓝图(Sound Blueprint)来管理音效的播放和停止,可以确保音效的控制和管理。此外,使用音效混合器(Sound Mixer)来调整音效的音量和平衡,可以确保音效的清晰可听。
10. 学习与成长
通过使用虚幻引擎5进行游戏开发,我深刻体会到蓝图系统在游戏开发中的强大功能和灵活性。通过不断学习和实践,我不仅掌握了蓝图的基本操作,还学会了如何利用蓝图实现复杂的游戏逻辑和功能。此外,通过与其他开发者交流和学习,我获得了更多的灵感和技巧,进一步提升了我的游戏开发能力。
总之,使用虚幻引擎5进行游戏开发,尤其是制作类似《地铁跑酷》的项目,是一个充满挑战和乐趣的过程。通过合理使用蓝图系统,开发者可以高效地构建游戏机制、角色控制、动画系统、用户界面(UI)以及音效等关键元素,从而创造出高质量的游戏体验。
八、参考文献
[1] 精通Unreal Engine 3卷Ⅰ:3D游戏关卡设计基础篇. (美)巴斯比等.[2015-08-03]
[2] 基于Surpac矿山设计软件及虚幻引擎实现的矿山虚拟现实漫游系统. 张二洋等.[2017]
[3] 虚幻引擎大师 | AI Assistants / GPTs · LobeHub. LobeHub.[2024-08-27]
更多推荐


所有评论(0)