虚幻引擎 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

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/XiuzhuKirakira/p/17316074.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!