目    录

目    录... 2

一、实训的目的与要求... 1

1.1 目的... 1

1.2 要求... 1

二、实训准备... 2

2.1工具准备... 3

2.2知识准备... 3

三、实训总体设计及思路... 4

3.1总体设计... 4

3.2开发背景... 5

四、系统分析... 6

4.1模型选取依据... 6

4.2系统功能分析... 6

游戏机制设计... 6

角色控制与动画... 6

障碍物与敌人设计... 6

用户界面与HUD.. 7

五、系统实现... 8

5.1UI界面设计... 8

5.2场景模型... 9

5.3角色模型(水晶、大炮)... 11

5.4蓝图脚本... 12

5.4.1完成GamePlay蓝图设置... 12

5.4.2添加摄像机... 12

5.4.3创建增强输入系统... 12

5.4.4设置角色移动逻辑和跳跃逻辑... 12

5.4.5创建角色的动画蓝图... 12

5.4.6地面循环生成蓝图... 12

5.4.7创建障碍物生成逻辑和障碍物数组... 12

5.4.8更新角色移动速度... 12

5.4.9金币生成逻辑... 12

5.4.10创建敌人... 12

5.4.11角色下滑逻辑... 13

5.5音频设计... 13

添加场景音效... 13

六、遇到的问题和解决方法... 14

七、心得体会... 16

八、参考文献... 18

一、实训的目的与要求

1.1 目的

通过本实训,基于UE5开发环境,使用蓝图语言,充分使用和综合运用《虚拟现实引擎开发》课程的所学内容,完成基于UE5在PC端的简单游戏的需求分析、设计和实现,掌握游戏的设计步骤和基本的开发流程。培养学生分析和解决问题的能力,增强学生在实践中的动手能力。

1.2 要求

  1. 掌握基础知识与操作技巧
    学生需要了解虚幻引擎的基本架构、界面布局、项目结构以及核心组件。掌握在虚幻引擎中创建、编辑和管理场景的技能,包括地形编辑、静态网格体放置、光源设置等技巧。
  2. 熟练使用工具与技术
    学生需要掌握虚幻引擎中的材质编辑器、蓝图系统、序列器、动画系统等工具的使用方法。同时,学生需要了解光照与渲染技术的原理,并能够熟练应用。
  3. 完成项目实训
    学生需要通过实际项目实训,完成从场景搭建、材质应用、光照设置到最终导出的全过程。实训过程中,学生将按照企业指导老师的要求完成各项任务,确保作品质量。
  4. 理论与实践相结合
    实训强调理论与实践相结合,学生不仅需要学习虚幻引擎的理论知识,还需要通过动手实践来加深理解。例如,学生需要通过案例分析和项目实践,了解行业前沿技术和设计理念。
  5. 持续学习与适应新技术
    实训要求学生具备持续学习和适应新技术的能力。随着虚幻引擎技术的不断发展,学生需要不断更新自己的知识体系,以适应行业变化。

二、实训准备 

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总体设计

  1. 创建项目
  2. 导入素材
  3. Gameplay
  4. 添加相机
  5. 创建增强输入系统
  6. 设置角色移动逻辑和跳跃逻辑
  7. 创建角色动画蓝图
  8. 创建地面及其循环生成
  9. 创建障碍物生成逻辑和障碍物数组
  10. 更新角色移动速度
  11. 设置金币生成和逻辑
  12. 创建敌人
  13. 设置建筑数组
  14. 角色下滑逻辑
  15. 优化环境迷雾

3.2开发背景

技术革新:UE5的发布标志着游戏开发进入了一个全新的时代。Lumen和Nanite等技术的普及,使得开发者可以更轻松地实现高质量的游戏和应用。这些技术不仅适用于游戏开发,还广泛应用于影视制作、建筑可视化、虚拟现实(VR)和军事模拟等领域。

行业影响:UE5的开源特性(通过GitHub平台)为开发者提供了更多的自由度和创新空间。开发者可以深入研究引擎的内部工作原理,并进行自定义和改进,从而推动游戏和虚拟现实技术的发展。

玩家体验:UE5的高画质和真实物理效果,使得玩家在地铁跑酷游戏中能够获得更加沉浸式的体验。例如,油管博主TeaserPlay使用UE5重新制作了经典游戏《地铁跑酷》,其逼真的写实风格让玩家大为惊叹,引发了网友们的热烈反

四、系统分析

4.1模型选取依据

需要实现类似于地铁酷跑的游戏,保持电脑的性能运行,所以选取低精度的3D模型

提高资源的可用性和尽可能的降低成本。

模型的选取还需要考虑其与虚幻引擎5的兼容性。

模型的选取还应考虑游戏的整体创意和艺术风格。

4.2系统功能分析

(正文为宋体,五号字  行间距为21 )

游戏机制设计

无尽跑酷机制:游戏的核心机制是“无尽跑酷”,玩家在地铁轨道上不断奔跑,躲避障碍物(如广告牌、障碍物等),并收集金币。这一机制需要通过蓝图系统实现,包括游戏循环、角色移动、障碍物生成和收集逻辑。

动态难度调整:随着游戏进行,障碍物的速度和密度会逐渐增加,以保持玩家的挑战性。这一机制可以通过蓝图中的变量和函数来实现。

角色控制与动画

角色移动:玩家通过滑动屏幕控制角色的左右移动,跳跃和蹲下功能可以通过蓝图中的事件图实现。例如,当玩家按下跳跃键时,角色会触发跳跃动画。

动画系统:角色的动画可以通过动画蓝图(Animation Blueprint)进行管理,确保角色动作流畅自然。动画蓝图可以与角色的移动状态同步,实现更真实的动画效果。

物理模拟:角色的跳跃和碰撞检测依赖于虚幻引擎的物理引擎,确保角色在空中和地面的运动符合现实物理规律。

障碍物与敌人设计

障碍物生成:障碍物(如广告牌、障碍物等)需要在游戏过程中动态生成。可以通过蓝图中的数组和随机生成机制实现,确保障碍物的分布合理且具有挑战性。

敌人AI虽然地铁跑酷游戏通常没有敌人,但可以引入简单的敌人AI,如巡逻的机器人或追逐玩家的敌人,以增加游戏的挑战性。

 用户界面与HUD

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]

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐