虚幻引擎 4 学习笔记 [1] :蓝图编程 Demo

发布时间 2023-04-13 19:19:00作者: 修竹Kirakira

虚幻引擎 4 学习笔记 [1] :蓝图编程 Demo

​ 最近学习虚幻引擎,主要看的是 Siki 学院的课,课程链接:Unreal蓝图案例 - 基础入门 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 (sikiedu.com)

​ 以下为课程笔记:

1. 创建工程

​ 选择蓝图,不带初学者内容包

2. 创建关卡1

image-20230319171316540

image-20230319171357200

3. 设计关卡1

​ 添加初学者内容包,可以使用一些里面的材质,纹理

image-20230323112313346

3.1 地形

  1. 选择 Geometry -> Box 更好地设置地形

    image-20230320114552568

  2. 铺设地板不能直接拖拽该 Actor,不然相应的贴图也会发生变形,可以使用 Brush Settings 来压缩地板块和改变长宽

    image-20230320114803238

    image-20230320115125986

  3. 也可以使用 Brush Editing 模式来编辑地形

    image-20230320115228127

    将该物体长度拖到 2000 ,调回放置模式,按 alt 快捷复制三个一样的板块,中间间隔 1000

    image-20230320121511977

  4. 堆砌墙面

    image-20230320133110010

    在 Brush Editing 模式下拉长墙面

    image-20230320194759465

    在放置模式下复制墙面:

    image-20230320234818821

  5. 给添加的 Actor 按 F2 进行重命名

    image-20230320235053780

    添加文件夹进行规整:

    image-20230320235230696

  6. 设计独木桥

    使用 Edit 和 Extrude,使用 Edit 来使板子倾斜,利用 Extrude 可以增加一些拐角和轴,使用时点击 Actor 的面

    image-20230323002433873

    image-20230323003530753

    选择模式下复制做好的独木桥,并将其旋转后拖入第二个空隙

    image-20230323003804079

  7. 给城墙添加材质

    image-20230323170254226

    1)选中想要添加的材质,点击左箭头符号直接运用

    image-20230323170402539

    2)点击 Surface Materials 里的下拉框搜索相关材质,然后运用

    image-20230323170505853

    点击 Select All Ajacent Surfaces 将选中材质附加到当前 Actor 的所有面

    image-20230323170651424

    image-20230323170852134

    运用后发现砖块材质过细,选中该 Actor 的所有面,将缩放调为 8 倍,点击 Apply

    image-20230323171056672

    image-20230323171202636

    使用相同的方法为另一边城墙附加材质

    image-20230323171331881

  8. 为三块地板添加材质

    image-20230323171603586

    image-20230323171626942

  9. 为桥附加材质

    image-20230323171754586

3.2 灯光

  1. 关闭游戏的自动曝光:Settings -> Projevt Settings -> Rendering -> Default Settings -> Auto EXposure

    image-20230320235522288

    image-20230320235902473

  2. 添置平行光,调试亮度,放置到中间,使用动静结合的方式,Build -> Build Lighting Only

    image-20230322204642181

    image-20230322205114509

  3. 添置天空光照

    image-20230323165219782

  4. 添置聚光灯

    image-20230322213946932

    image-20230322214337532

  5. 规整结构

    image-20230322214747574

3.3 火炬

  1. 制作火炬的椎体:

    image-20230323180445015

    image-20230323180500984

  2. 添置火焰:初学者内容包 StarterContent -> Particles -> P_Fire

    1)通过三视图调整火焰的位置

    image-20230323181753551

    image-20230323182754128

    image-20230323182735704

    2)调整火焰的角度

    image-20230324002113122

  3. 为火焰添加墙壁的反射光

    1)调整参数

    image-20230324004710141

    2)调整点光源位置使与火焰同一位置

    • 直接拷贝位置

      image-20230324004903190

    • 手动调整位置

    image-20230324003046574

  4. 将创建的火炬转换为静态网格

    image-20230324004012394

  5. 将子物体附着到火炬下

    image-20230324004226636

  6. 将火炬及子物体转换为蓝图类:

    选中所有需要转换的物体,点击 Blueprints -> Convert Selection to Blueprint Class...

    image-20230324005240906

    image-20230324235116148

    image-20230324235215805

  7. 转换为蓝图类后,该火炬可以很方便的整体调节参数,也可以单独调整一个

    image-20230324235248946

  8. 快速复制摆放六个火炬:

    image-20230325000007412

    image-20230324170237326

  9. 修改蓝图类组件的名字

    image-20230325000359765

3.4 可收集物

3.4.1 创建可收集物的蓝图类

  1. Add/Import -> Blueprint Class 创建蓝图类

    image-20230324175316906

  2. 选择 Actor 作为父类

    image-20230324175538259

  3. 添加组件:Satic Mesh

    image-20230325150826231

  4. 选择静态网格的形状

    image-20230325151013339

  5. 按住 Ctrl + w 复制网格体出来

    image-20230325151132647

  6. 将下半部分的静态网格进行翻转

    image-20230325151301063

  7. 为了使宝石的两边变成一个整体,可以将宝石的下半部分变为上半部分的子物体

    image-20230325151433745

  8. 修改宝石的缩放

    image-20230325151614605

  9. 将水晶上下部分的碰撞设置为 NoCollision,防止后面水晶飞向玩家时将玩家击飞

    image-20230326222354721

3.4.2 给可收集物建立发光材质并添加水晶光照

  1. 创建材质:右键 -> Material

    image-20230325151955003

  2. 在材质编辑器里新建结点的四种方法:

    1)随机右键一个区域,输入想要创建的结点,进行连线

    image-20230325152653843

    2)从 M_Crystal 里直接拖拽出来一根线

    image-20230325152806696

    3)从 Palette 目录里拽出一个结点

    image-20230325152858928

    4)在某些结点边上会写上快捷键,如:按住 3,鼠标左键点击一下就会创建一个结点

    注意:按 alt 再左键点击一条线可以断开该线

  3. 选择材质的颜色

    image-20230325194448336

  4. 对颜色进行增强:在颜色结点拉出另一条线搜索 Multiply 函数,修改 B 的值为 5

    点击 Apply,点击 Save

    image-20230325194614243

    image-20230325194831457

  5. 修改水晶的材质为设置好的材质

    image-20230325195133265

  6. 添加水晶的光照

    1)在水晶蓝图类内部添加点光源的组件

    image-20230325195310138

    2)设置点光源的参数

    image-20230325195544465

  7. 为水晶蓝图类添加旋转组件:Rotationg Movement

    image-20230325200404593

    设置旋转速度:

    image-20230325201345179

3.4.3 使水晶可以被玩家收集

  1. 为 BP_Crystal 添加一个球形碰撞

    image-20230326203855377

  2. 将添加的球形碰撞(即触发器)移动到根物体:

    image-20230326203946941

  3. 修改球形碰撞的 Sphere Radius,使其完整包裹住水晶

    image-20230326204044976

  4. 添加简单的事件函数(此时可以简单控制玩家靠近水晶即销毁):只有当玩家靠近水晶才会被销毁

    image-20230326204531613

3.4.5 添加水晶飞向玩家的动画

插值函数 Lerp:Alpha的数值范围是0到1。

image-20230326210034111

if(Alpha==0) ReturnValue=A
if(Alpha==1) ReturnValue=B

如果Alpha在0到1之间,Alpha值越接近0则ReValue的值越接近A,Alpha值越接近1则ReValue的值越接近B

  1. 添加 Lerp 插值函数,通过 Alpha 的值来决定返回值

    image-20230326210034111

  2. 添加 SetActorLocation 函数来设置水晶的位置

    image-20230326220537324

  3. 添加时间轴

    image-20230326220822107

  4. 双击时间轴设置属性:

    由于需要通过时间轴的返回值来设置 Alpha,所以选择浮点值:

    image-20230326220949891

    水晶飞过来的值设置为 0.75

    image-20230326221026147

  5. 按住 shift 在浅色区点出两个点,设置第一个点的时间为 0 ,返回 0,第二个点的时间为 0.75,返回 1

    image-20230326221302967

    点击全窗口展示

    image-20230326221519057

    也可以右键使该直线变为曲线:

    image-20230326221615269

  6. 设置好时间轴之后开始连线:设置时间轴让 Alpha 的值随着时间改变,B 的位置即为 玩家的位置,A 的位置则为水晶最开始的位置,当 Alpha 最开始为 0,水晶位置不变,当 Alpha 缓慢变到 1,水晶的位置慢慢移到玩家所在的位置,最后再销毁水晶

    image-20230326223029163

  7. 获得水晶最开始的位置:

    添加 GetActorLocation 函数,该函数实时获得水晶的位置,由于水晶一直在移动,所以水晶最开始的位置需要用一个变量暂存:

    • 右键 Return Value,选择 Promote to Variable 创建一个变量

      image-20230326223430926

      image-20230326223617407

    • 连线,使运行时间轴之前保存水晶的位置:

      image-20230326223825226

    • 最后将保存的水晶的最初位置输入 Lerp 插值函数的 A 处

      image-20230326223906067

      这样看起来线太复杂,也可以直接获取变量值再连接,获取变量的值的方法如下:

      • 将左侧的变量直接拖出到 A 处可以自动连上

        image-20230326224132782

      • 将变量拖到空白位置,选择 Get,手动连线

        image-20230326224210090

      • 按住 alt 键,拖出变量直接是 Set

      • 按住 ctrl 键,拖出变量直接是 Get

    image-20230326224406098

  8. 最后进行测试,将 BP_Crystal 的 Trigger 的范围扩大(使动画效果更明显),然后放置一些道具水晶

    image-20230326225929133

3.4.6 制作水晶被收集时大小和亮度的变化

大小变化

  1. 添加 Lerp 插值函数,通过 Alpha 的值来决定返回值

  2. 添加 Set Actor Scale 3D 函数来设置水晶的大小

    image-20230326230712834

  3. B 端直接为 0,A 端可能还需要暂存一下:

    image-20230326231026589

  4. 新添加一条时间轴

    image-20230326231140411

  5. 为了营造忽闪忽闪的感觉,可以在时间轴上多点几个点,设置起伏,最后选中所有的点平滑一下曲线

    image-20230326231712194

  6. 进行连线

    image-20230326232101449

亮度变化

  1. 暂存亮度:

    image-20230327125616753

  2. 添加时间轴

    image-20230327125818105

  3. 连线:

    image-20230327130420882

3.5 添加主角——钢球

3.5.1 创建蓝图类

  1. 创建蓝图类,选择父类为 Pawn

    image-20230325202456902

  2. 添加静态网格组件,指定为球体

    image-20230325202709686

    image-20230325202852002

  3. 设置钢球的材质

    image-20230325203032878

  4. 如何将蓝图视口中的导航小球去掉:将 Player 拖到 DefaultSceneRoot 处

    image-20230325203241786

  5. 为钢球添加相机跟随:

    1)添加组件:SpringArm,即类似于相机杆,将其移动到球体中心

    image-20230325203604714

    设置

    2)添加组件:Camera,一般添加后会自动吸附到 SpringArm 上,如果没有吸附的话,可以调整坐标都为 0,即之后会自动调整

    image-20230325204254414

    3)调整视角

    image-20230325204453787

    4)调整摄像机距离钢球的长度

    image-20230325204913795

    5)设置 Spring Arm 相对于世界 60 度,而不是相对于小球 60 度,防止之后视角随小球滚动而滚动

    image-20230326172727703

    6)关闭相机的碰撞:

    image-20230326172919996

3.5.2 使 Player Controller 持有本地 Player

  1. 在 Play 模式下如何退出?

    1)按 esc

    2)按 shift+F1 跳出 ViewPoint 的控制,点击 Possess or Eject Player 回到可以编辑的模式

    image-20230325210338126

  2. 如何使 Player Controller 持有本地 Player

    1)直接将 Auto Possess Player 设置为 Player 0 (不推荐这种方式)

    image-20230326104011256

    2)利用 Player Start 设置玩家起始位置,然后在游戏运行时虚幻引擎会在 Player Start 的位置自动生成一个指定的 Pawn,然后让 Player Controller 去持有 Player

    • 放置一个 Player Start,手动调整使其贴地,也可以放在空中,然后按下 fn+end

      image-20230326105545619

    • 自定义 GameMode:创建一个蓝图类,设定父类为 Game Mode Base

      image-20230326105659630

      将 Default Pawn Class 设置为 BP_Player

      image-20230326105838499

    • Project Settings -> Maps & Modes ->Deafault GameMode 设置为自己的 BP_GameMode

      image-20230326110048245

3.5.3 按键映射与输入控制

控制玩家移动:设置 BP_Player 的事件

1)将默认的三个事件全部删除

2)两种接收键盘输入的方式:

  • 右键点击输入搜索结点:

    image-20230326111019188

    绑定按下的函数:

    image-20230326111525312

    这样的弊端:按下 w 只调用一次函数,并不会一直执行,而是按一次显示一次,所以这种方法不推荐

  • Project Settings -> Input -> Axis Mapping -> +

    image-20230326165938047

    添加键盘映射:

    image-20230326170124546

    在蓝图内添加轴映射的结点

    image-20230326170327093

3.5.4 使小球转动起来

  1. 使小球有一个物理性质

    image-20230326172605579

  2. 获得小球的数据体:将 Components 中的 Player 拖出来,选择 Get Player

    image-20230326172023514

    image-20230326172114107

  3. 给小球添加力矩

    image-20230326172206938

    右键 Torque 选择 Split Struct Pin 将 x y z 值分开

    image-20230326172232022

  4. 施加 y 方向的力矩,注意勾选 Accel Change 忽略小球本身的质量,否则加强系数需要设置得非常大

    image-20230326173600193

  5. 施加 x 方向的力矩

    image-20230326173849457

  6. 给小球施加摩擦力

    image-20230326174450613

3.5.5 设计失败触发器

  1. 创建蓝图类

    image-20230326174704355

  2. 添加碰撞盒子组件

    image-20230326174801129

  3. 将碰撞盒子放置在关卡中间,调整缩放

    image-20230326175233367

    image-20230326175329649

  4. 在 BP_FailTrigger 内添加 ActorBeginOverlap 事件

    image-20230326175558067

  5. 添加小球失败的逻辑:当小球掉下接触到碰撞盒子,获得当前关卡的名字,重新打开一次当前关卡

    image-20230326175915998

  6. 添加一些容错判断:只有当掉落物体为 Player 的时候才能出发重新打开关卡

    注意:按住 B + 鼠标左键点击一下就可以放置一个分支

    image-20230326180508421

    image-20230326180900861

3.5.6 给小球失败添加一个淡入淡出的效果

当小球掉落时,添加一个从 0-1 的渐变过程

  1. 在 BP_FailTrigger 添加相机的淡入淡出功能,设置保持黑暗 1 秒,注意必须设置 Delay 才会延时

    image-20230326182343359

当游戏开始时,添加一个从 1-0 的渐变过程

  1. 在 BP_Player 中添加 BeginPlay 事件,添加摄像机的淡入淡出函数

    image-20230326182934022

3.5.7 按 ESC 游戏退出

image-20230413123426883

3.6 可发射的子弹

3.6.1 创建

  1. 创建子弹的蓝图类

    image-20230327214012547

  2. 添加组件:

    image-20230327214210677

  3. 设置网格体的形态和材质

    image-20230327215109699

  4. 添加 Projectile 组件

    image-20230327215755150

  5. 设置 Projectile 的参数:投掷速度和重力影响

    image-20230327220101944

3.6.2 添加粒子效果

  1. 添加粒子组件

    image-20230327220453337

  2. 设置粒子效果:

    image-20230327220635450

  3. 缩小子弹使粒子效果更明显:

    image-20230330142629045

  4. 双击 P_Sparks 进入粒子系统修改粒子效果:

    通过勾选或直接右键 Emitter->Delte Emitter 将电火花删除

    image-20230328141418639

    image-20230328141442869

3.6.3 子弹击中其他物体时的操作

  1. 添加球形碰撞,使用球形碰撞代替根部的小球

    image-20230328142932898

  2. 调整球形碰撞的范围

    image-20230328143104327

  3. 调整球形碰撞的 Collision Presets 为 BlockAll

    image-20230328143644489

  4. 添加子弹击中事件

    image-20230328144312590

3.6.4 创建炮台和炮管

  1. 直接导入炮台和炮管的模型:

    选择不创建材质

    image-20230328145131228

  2. 同时选中炮台和炮管放置到关卡中:

    image-20230328152255359

  3. 将炮管设置为可移动的

    image-20230328223647452

  4. 将炮管依附在炮台底下:

    image-20230328223951915

  5. 创建蓝图类:

    image-20230328224523024

    image-20230328224600990

  6. 设置炮台和炮管的材质:

    image-20230328224816521

    image-20230328224851194

  7. 控制内容浏览器中预览图的大小:按住 ctrl + 鼠标滚动

  8. 编辑预览图中的物体:View Options -> 勾选 Thumbnail Edit Mode,然后像操作视口一样操作预览图中的物体

    image-20230328225019783

3.6.5 使炮台生成可循环发射的子弹

  1. 添加 Arrow 组件:

    箭头的基部作为炮弹生成的地方,箭头的方向即为炮弹发射的方向

    image-20230328230228870

    image-20230328231216858

  2. 添加 SpawnActor BP Projectile 函数,选择 BP_Projectile 作为蓝图类

    image-20230330142231579

  3. 连线,使循环发射子弹

    双击连线可以重定位结点

    image-20230402203315088

3.6.6 创建开火动画

  1. 创建时间轴设置炮管在 Y 轴的位置

    image-20230403122423497

    image-20230403122505616

  2. 连线:

    注意:

    • 动画从开始播放:Play from Start
    • 播放完成后再发射子弹

    问题:延时 1 秒 + 动画 0.3 秒时间变长了

    image-20230403123009322

3.6.7 时间轴的事件轨道与开火特效

达成效果:先生成子弹再播放动画

  1. 重新连线

    image-20230403211713894

达成效果:解决延时 1 秒 + 动画 0.3 秒时间变长了的问题

  1. 添加 Event Track

    image-20230403212010705

  2. 使时间轴刚开始时生成一个执行的针脚,用来后续的连线

    image-20230403212153484

  3. 重新连线,此时会在动画刚开始播放时就进入发射子弹的逻辑,就不用包含动画播放的 0.3 秒

    image-20230403212400856

开火特效

  1. 添加 Particle System

    image-20230403213202411

  2. 复制炮弹生成的位置并粘贴

    image-20230403213330980

  3. 指定爆炸效果:

    image-20230403213458216

  4. 对爆炸效果进行缩放

    image-20230403214537457

  5. 关闭自动激发

    image-20230403214637798

  6. 连线:

    image-20230403215015178

3.6.8 子弹击中小球造成伤害

  1. 给 BP_Projectile 添加伤害函数:

    image-20230403233312089

  2. 将 BP_FailTrigger 中的淡入淡出效果拷贝粘贴过来,给 BP_Player 添加伤害事件,即当小球被打到之后重新开始关卡

    image-20230404111949464

    image-20230404210637103

4. 蓝图整理

4.1 子图与函数

4.1.1 子图

​ 将相同操作收缩为一个结点,相当于创建了一个文件夹放入这些类似操作

  1. 选中类似的操作:

    image-20230404211440327

  2. 右键选择 Collapse Nodes

    image-20230404211503696

    image-20230404211643315

注意:该方法不能实现代码复用,不常用

4.1.2 函数

  1. 选中类似的操作:

    image-20230404211440327

  2. 右键选择 Collapse to Function

    image-20230404211911712

    image-20230404212008348

  3. 继续收缩

    image-20230408213420322

    image-20230408213850101

  4. 继续收缩

    image-20230409224609156

    image-20230409224710332

  5. 继续收缩

    image-20230409224810190

    image-20230409224843062

4.2 宏与宏库

4.2.1 宏

函数缺点:具有多个执行流输出的不适合收缩为函数

image-20230408214252804

  1. 选中类似操作收缩为宏:

    image-20230409175229054

  2. 在此处可以调整宏里面结点针脚的顺序和名称

    image-20230409181419265

  3. 为输出流增加执行针脚:

    image-20230409181509553

    image-20230409181548693

  4. 收缩后如下所示:

    image-20230409181848368

4.2.2 蓝图宏库

蓝图宏库(Blueprint Macro Library) 是一个容器,它包含一组 宏 或自包含的图表,这些图表可以 作为节点放置在其他蓝图中。它们可以节省时间,因为它们可以存储常用的节点序列, 包括执行和数据传输所需的输入和输出。

​ 宏在引用它们的所有图表之间共享,但是它们会自动扩展到图表中, 就像它们在编译期间是一个折叠节点那样。这意味着蓝图宏库不需要编译。但是, 对宏的更改仅反映在重新编译包含这些图表的蓝图时 引用该宏的图表中。

蓝图宏库

  1. 创建蓝图宏库:

    1)创建文件夹:Library

    image-20230409182450157

    2)添加蓝图宏库

    image-20230409182545379

    image-20230409182559549

  2. 将刚才创建的宏中的结点赋值拷贝过来(除了输入输出结点都要复制)

    image-20230409183518048

  3. 连线,设置输入输出结点

    image-20230409183753689

  4. 使用方法:可以直接搜索该宏

    image-20230409184014669

4.2.3 蓝图宏库的使用

  1. 将重入关卡的结点拷贝到蓝图宏库中保存为新的宏

    image-20230409184659758

  2. 将所有涉及重入关卡的地方使用该宏替换

    image-20230409184745479

  3. 将摄像头淡入的操作封装为宏

    image-20230409191733369

  4. 进行替换

    image-20230409192006499

    image-20230409192052542

  5. 使手动可以设置 Duration 的值

    image-20230409192314350

4.3 暴露蓝图变量

  1. 将项目中意义不明或者模糊处替换为变量,取一个合适的变量名

    image-20230409193206066

  2. 暴露变量

    image-20230409193221916

    image-20230409193532537

    将 Default 的标签改掉:

    image-20230409193749286

    image-20230409193804479

  3. 指定变量的下限

    image-20230409193927878

  4. 继续设置变量

    image-20230409194324305

    image-20230409194803056

4.4 蓝图注释

  1. 选中想要添加注释的部分

    image-20230409225447844

  2. 按 C 键

    image-20230409225538557

4.5 蓝图函数的纯净与非纯净

纯净函数:绿色结点,不改变游戏的状态,如:单纯的计算某个东西的值

image-20230412183809181

非纯净函数:蓝色结点,改变游戏的状态

image-20230412183819598

  1. 收缩纯净函数:

    image-20230412184110412

    image-20230412184231289

    image-20230412184315607

  2. 将宏改造为纯净宏:

    将投射改为纯净投射:

    image-20230412184555873

    删除输入和输出结点的执行线:

    image-20230412184715337

    全局查找使用该宏的地方,修改连线

5. 追光灯

5.1 创建追光灯

  1. 创建蓝图类:BP_SpotlightFollow

  2. 添加碰撞盒子组件

    image-20230409230157363

  3. 在桥的水晶处添加追光灯,设置碰撞盒子的大小

    image-20230410113433069

    image-20230410113445336

  4. 调整 SpotLight 的参数

    image-20230410113846325

  5. 将本实例的变动覆盖到蓝图类中

    image-20230410114220278

5.2 使追光灯持续照亮主角

Interp To 函数:插值,在两个数之间补充一些数,让过渡变得更自然

常见的插值函数:

image-20230411174120972

  • FInterp To、FInterp To Constant:浮点数(Float)插值。F:Float,浮点数

  • RInterp To、RInterp To Constant:角度(Rotation)插值。

    RInterp To | Unreal Engine Documentation

    image-20230411174321192

    输入参数:

    参数 值
    CurrentRotator Actual rotation
    TargetRotator Target rotation
    Delta TimeFloat Time since last tick
    Interp SpeedFloat Interpolation speed, if the speed given is 0, then jump to the target.
    InterpSpeed = 1 / Time = 2 Time = 0.5

    输出值:

    值
    Return ValueRotator New interpolated position
  • Vector To、Vector To Constant:向量插值

​ 带有 “Constant” 的,表示匀速插值(线性插值);没带有 Constant 的,表示缓冲插值(非线性插值),到达终点值的时候放慢,有一个更平滑的缓冲,给人的感觉更柔和一些。

Find Look at Rotation:找到目标对象相对于当前对象的旋转角度

  1. 记录玩家的触发状态:

    image-20230411175633215

  2. 每帧设置聚光灯的朝向

    image-20230411175722092

  3. 获得聚光灯朝向的目标旋转角度:

    image-20230411181149092

  4. 整体结点连接如下:

    image-20230412120533687

6. 过关区域

6.1 创建过关区域

  1. 在编辑模式下选中地板的侧面,往后缩 500

    image-20230411181758681

    image-20230411181842501

  2. 利用挤出功能拉回原来的长度

    image-20230411181938859

  3. 将拉出的面抬高做成一个台子

    image-20230411182142918材质赋值:

    image-20230411183252323

  4. 添加一个管道

    image-20230411185048777

  5. 调整管道靠在台子上

    image-20230411185323060

  6. 选择所有面附加材质

    image-20230411185516771

  7. 调整天光和平行光

    image-20230411190120975

6.2 设计胜利触发器

UE4 中GameInstance、GameMode、GameState、PlayerState和PlayerController的关系:

名称 生命周期 存在的位置(服务器或客户端) 服务端和客户端是否能同步 使用方式
GameInstance 引擎启动时创建,引擎关闭后销毁或更换 都存在 不能,服务器和客户端时独立的,彼此不通信 在多关卡中来回切换,需要一个公共的变量来进行记录所需要的数据,进行数据交互。GameInstance类就充当这个全局类来记录全局数据。
可以用来保存特定类型的持久数据,如用户账户信息
GameMode 关卡加载时生成,销毁时一起销毁 仅在服务器 无此说法 存储客户端不需要明确知道的游戏信息,如出现的玩家和观众数量,以及允许的玩家和观众最大数量。
玩家进入游戏的方式,可包含选择生成地点和其他生成/重生成行为的规则。
游戏是否可以暂停,以及如何处理游戏暂停。
游戏是否可以暂停,以及如何处理游戏暂停。
关卡之间的过渡,包括游戏是否以动画模式开场。
GameState 关卡加载时生成,销毁时一起销毁 都存在 可以,服务器可以在GameState上使用复制变量让所有客户端保持最新的游戏数据 与所有玩家和旁观者有关、而不是与任何一个特定玩家有关的信息,如
游戏已运行的时间(包括本地玩家加入前的运行时间)。
每个个体玩家加入游戏的时间和玩家的当前状态。
PlayerState 关卡加载时生成,销毁时一起销毁 都存在 可以,服务器可以在GameState上使用复制变量让所有客户端保持最新的游戏数据 与一个特定玩家有关的信息,如玩家的分数
PlayerController 关卡加载时生成,销毁时一起销毁 服务器上每个玩家都有PlayerController,但本地客户端只有本地玩家的PlayerController 客户端和服务器之间传达信息,而不必将该信息复制到其他客户端
  1. 创建蓝图类 BP_Wintrigger

  2. 添加碰撞盒子

    image-20230412100236247

  3. 将该蓝图类的实例拖入场景中,缩放其大小

    image-20230412095842787

6.3 储存水晶总数

  1. 创建 BP_GameInstance ,可以储存一些全局变量

    image-20230412102512322

  2. 获得 BP_GameInstance

    获得 GameInstance (父类),将其投射为 BP_GameInstance

    image-20230412104022550

    将此操作封装为宏:

    image-20230412104328113

  3. 保存水晶总数:

    image-20230412105801177

6.4 设计水晶自增并编写胜利条件

  1. 水晶自增函数:

    image-20230412105529438

  2. 添加水晶自增的逻辑:当水晶被玩家触碰时,实现动画效果后使水晶数量+1,之后被销毁

    image-20230412105849002

  3. 编写胜利条件:

    image-20230412122112133

  4. Project Settings -> Maps & Modes -> Game Instance -> BP_GameInstance

    image-20230412110653949

7. 用户界面(UI)

7.1 创建 UI

  1. 创建 UI:User Interface -> Widget Blueprint

    image-20230412170435237

  2. 设计 UI 界面:

    image-20230412172101744

  3. 在 BP_Player 中创建并显示界面

    image-20230412171624506

7.2 显示关卡名和水晶

  1. 当 UI 被创建后,获得当前的关卡名,保存在变量中

    image-20230412172639951

  2. 绑定变量

    image-20230412172557689

  3. 新建绑定函数:

    image-20230412172933982

    image-20230412173315074

  4. 获得收集的水晶和总的水晶数量

    注意:在 UI 函数中不能调用宏库中的宏

    image-20230412174013111

    可以将其封装为本地的宏:

    image-20230412180620658

7.3 显示所用时间与跨关卡计时

  1. 在 BP_GameInstance 中添加变量:GameTime

    image-20230412181004038

  2. 在进入关卡绘制 UI 界面后,获得全局的累加游戏时间,将累加的游戏时间作为显示的 LevelTime

    image-20230412181229482

  3. 累加加上每帧的时间

    image-20230412181431253

  4. 为 UI 中的显示时间创建绑定的函数,将 LevelTime 从浮点型转换为 TEXT 型显示出来

    image-20230412181818154

  5. 在 BP_WinTrigger 中获取 UI 中计算的时间值,将总的时间值赋给 BP_GameInstance.GameTime

    image-20230412183409056

    将此段逻辑收缩为函数:

    image-20230412183444249

    image-20230412183531169

7.4 游戏胜利后的处理

7.4.1 添加获胜后的提示

  1. 在 BP_UI 中拖入胜利提示框,将 Visibility 处选为 Hidden 即可在游戏运行中隐藏该字样

    image-20230413105811354

  2. 在 BP_GameInstance 中添加变量 IsWin 记录游戏状态

    image-20230413105950283

  3. 在 BP_Wintrigger 中设置游戏获胜状态

    image-20230413110211939

  4. 在 BP_UI 中为 "You Win!" 创建绑定函数

    image-20230413110634961

7.4.2 获胜后停止计时并取消对小球的控制

  1. 在 BP_UI 中编写逻辑:游戏获胜时停止游戏计时,并取消玩家的物理效果

    image-20230413111616102

  2. 在 BP_Player 中添加逻辑,玩家获胜后将不能再进行移动

    image-20230413112034203

7.5 显示未收集完时的 UI 闪动效果

  1. 在 BP_UI 中绘制文字框

    image-20230413112719826

  2. 设置 Visibility

    image-20230413112844124

  3. 添加动画

    image-20230413112921404

  4. 添加轨道

    image-20230413113009783

  5. 添加操作

    image-20230413113048741

    image-20230413113111654

  6. 拖动右侧的滑动条设置每隔 0.25 秒变换一次 Visibility

    image-20230413113405345

  7. 在 BP_UI 中创建函数播放动画

    image-20230413114145817

  8. 在 WinTrigger 中调用该函数

    image-20230413114250955

  9. 在关卡刚开始时,重置每个关卡的手机水晶数

    image-20230413114550226

8. 创建关卡 2 并进行设计

8.1 创建与设计

  1. 若要在关卡 1 的基础上进行改动,选择 File -> Save Current As...

    image-20230412185651564

  2. 保存即可

    image-20230412185734844

  3. 设计关卡 2

    image-20230412195317025

8.2 关卡蓝图

关卡蓝图:每个关卡有且仅有一个

  1. 打开关卡蓝图

    image-20230412195604412

  2. 改变关卡 2 的相机视角:

    1)在 BP_Player 中添加一个函数 AdjustCamera

    image-20230412200249748

    2)在关卡 2 的蓝图中调用 BP_Player.AdjustCamera 调整悬臂的长度

    image-20230412200519072

    3)调整后视角如下

    image-20230412200640327

8.3 关卡切换

  1. 在胜利触发器中创建变量 LevelNames 储存

    image-20230412200955718

  2. 数组赋值:注意编译后才能进行赋值

    image-20230412201512031

  3. 获取当前关卡的索引并与最后一个关卡的索引进行比较:

    image-20230412201940017

    收缩为纯函数:

    image-20230412202259602

    收缩为纯函数之后没有多余针脚,所以需要进行设置:

    image-20230412202419313

    将其中用来查找当前关卡索引的逻辑收缩为函数:

    image-20230412202811505

    image-20230412203325608

    image-20230412202859047

    将 GetLevelIndex 设为纯函数:

    image-20230412203428959

  4. 编写逻辑:加载下一个关卡

    image-20230413104754184

    如果不是最后一关,则自动加载下一个关卡

    image-20230413105052452

9. 游戏音效

  1. 创建文件夹:

    image-20230413115709513

  2. 将音频文件导入

    image-20230413115802824

  3. 按 Ctrl + Shift + s 或者点击 Save All 保存

    image-20230413115900687

  4. 设置背景音乐:

    1)直接双击点开 Cave1 和 Cave2 进行设置:勾选 Looping 循环播放

    image-20230413120114531

    2)在关卡蓝图中设置播放背景音乐:

    image-20230413120339033

    image-20230413120517240

  5. 音效设置:创建 Cue

    image-20230413120638254

    1)创建声音衰减模板

    image-20230413121205562

    2)使 Collection_Cue 和 Fire_Cue 使用刚刚创建的声音衰减模板

    3)设置声音衰减模板

    image-20230413121548112

  6. 设置播放声音:

    1)水晶:粒子特效

    image-20230413122545305

    2)加农炮:开火

    image-20230413122135106

10. 游戏发布

  1. File -> Package Project

    image-20230413122902955

  2. 发布的配置:

    • Development :开发者模式发布
    • Shipping:直接发布

    image-20230413123047402