(TODO)Unreal-FPS游戏Demo

这个信息量很大,还没消化完,需要不断练习工具。
另外这个应该拆分成多个博客,形成一个整体的技能树,细化学习下。

TODO LIST

无法在主窗口和副窗口切换的问题,太影响体验了!似乎不是每个人都遇到,我回到家里的电脑上试试。如果不行,必须得搞个双屏,不然切不过去太难受了!

可以将父窗口拖动到主窗口上,以 Tab 的形式切换,这样就很方便了。这个应该是 UE 故意设计成这样的,不是 BUG。

缺乏一个整体的模块和流程设计图,太散了,讲到一点是一点;我得自己补上来。

把各种功能的技术单独拆解记录下笔记,不然太散乱了。关键的蓝图截图放一下

有没有蓝图自动排版工具?
有的:https://blog.csdn.net/qq_31788759/article/details/103730098

如何快速切换镜头和摄像机?

  • 加入劲爆的的背景音乐
  • (Bug)子弹目前反弹也会被识别为命中
  • 中文无法显示的问题
  • 炫酷的粒子效果
  • 子弹音效(另外一个 FPS 的子弹音效沉浸感很强,且达到不同的物体,音效会不一样,很 nice)
  • 子弹击中和人物死亡的音效
  • 把敌人改为生动点的角色模型
  • 敌人生成搞个光柱传送的效果(ChatGPT: 在Unreal Engine引擎中,用C++实现光柱传送门特效,请提供代码)
  • 增加怪物一波一波的逻辑
  • 增加生成的怪物数量上限
  • 增加怪物攻击角色的 AI
  • 增加计分功能
  • 增加 HUD 统计面板
  • 增加开始页面
  • 增加关闭页面
  • 增加药水和宝箱机制
  • 增加倒计时机制
  • Buff 机制
  • 数据存储?
  • 行为树:Minion AI with Behavior Trees (Roam, See, Chase, Attack, Flee/Heal)、C++ Custom Behavior Trees Nodes

增加子弹粒子效果

19 分的子弹效果没加

注意:这个应该是编辑 First Person Projectile 的蓝图,这是子弹的蓝图

我选择了 P_JumpAndDive_Fire_01 这个粒子效果

自己做特效:https://www.cnblogs.com/sevenyuan/p/5685378.html

Hit Normal:打中的方向;如果粒子默认朝上,那么需要给 Hit Normal 加个 Make Rot from z 的节点,再连接到粒子对象的 rotation 上面去

我笔记本没显卡,加了粒子效果很卡。

目前用到的几个粒子(开发阶段都去掉了):

1、Projectile 蓝图:子弹命中特效

2、敌人蓝图:敌人被命中的特效,应该是爆血,但是没找到对应粒子,只能找个爆炸的凑合用用

3、敌人蓝图:死亡爆炸效果

增加敌人模型和 AI

从 content 这里,新增,选择 Add Feature or Content packs to the project

51 分:定时向玩家的方向走

先创建一层 mesh,标注哪些地方可以走

小键盘 4 还可以打开敌人的视力

  • 创建一个 AIController 的类
  • 在 Charactor 的 Default Class 中的 Pawn 里面,设置 AIController 为刚才创建的这个

如何让子弹和人物碰撞,而不是和人物外层碰撞?

人物有 2 层,我们把外面一层设置为 Pawn,里面的具体人物,设置为 PhisicsBody,然后设置子弹 Projectile 和 Pawn 不碰撞,和 PhisicsBody 碰撞,就可以了。

命中不同 Material 产生不同效果

通过 PhisicsMaterial 实现;注意物体的材质有两种:看上去的样子、以及物理效果(PhisicsMaterial)

42 分钟开始,翻车了,我先跳过

让敌人动起来

49 分 40 秒开始

在 AIController 中实现,通过自带的导航系统和 Timer

需要从左侧的 Place Actors 中搜索,放一个 Nav Mesh Bounds Volume 到场景中,否则 AI 不知道哪些地方能走

注意拖入 Nav Mesh Bounds Volume 后,要先执行一次 Build,然后按 P,就可以出现绿色的范围了。

单引号,可以开启 debug 功能,看到敌人走的时候用了哪些 Mesh

让敌人看到你的时候才跟过来

在敌人的蓝图里面,添加组件 AIPerception

单引号打开 Debug 后,按小键盘 4,可以打开敌人的视力(干,我没小键盘……)

注意默认敌人是只跟随敌人的,要改为中立也跟随。

img

(TODO)EQS

EQS:Environment Query System,环境检测,让 Actor 知道周围哪里可以去之类的。

通过增加各种 Test 来检测,计算每个位置的得分或者 Boolean 值,来确定应该去哪个位置。

创建方式:新建-Artifical Intelligence-Environment Query

注意需要通过 BlueprintClass 创建一个EQSTestingPawn对象,将 EQS 绑定到这个对象上,才能显示效果。

让敌人跟你躲猫猫:躲到你看不到的最远的位置

通过 EQS,计算 Trace 和 Distance 的反向分值.

Trace:看得到中心点的位置,反向就是看不到中心点的位置

Distance:距离,反向就是最远

注意:
1、EQSTestPawn 别放太高或者太低,否则不起效

一开始是用的 SimpleGrid,但是这个不合理,因为人的视野范围不是矩形,而应该是扇形。

用 SimpleGrid 还遇到一个问题,就是初始的矩形范围过小,导致这个范围内找到的隐藏点,可能并不是一个合理的隐藏点,详见1 小时 15 分左右的调试排查过程,这个对于调试很有帮助。

然后用了 Donut

又遇到一个问题,就是得分点可能在障碍物内部,角色无法到达这个点,但是仍然会靠过去。

因此给 EQS 再加了一个 PathExist 的 Test

然后还是有问题,一些和障碍物重合的位置,还是会被 Trace 识别到

然后给 EQS 加了一个 Overlap Box 的 Test,但是说性能有影响,后来又先去掉了。

随机选择一个点生成

在 AIController 中的 Run EQSQuery 节点中,将 Run Mode 这个属性,设置为 Single Random Item from Best 25%,而不是 Single Best Item,否则多个敌人的时候,全部都会在一个点生成。

死亡专题

死亡销毁

是加在子弹(Projectile)上的

子弹上增加向量判断,注意选择的是Apply Point Damage,没弄清为啥

然后在敌人上进行设置:当触发 Event AnyDamage 的时候,执行 Destroy Actor 操作,销毁自己

调整粒子的方向

从 Event 的 Hit Normal 拉一根线出来,添加 Make Rot from z,然后连到 Spawn Emitter at Location 的 Rotation 属性即可。

死亡倒下

之前人物是没有开启物理反应的,所以子弹打中敌人,敌人模型没有任何反馈。

死亡的时候,不 destroy,改为设置 Set Simulate Physics,然后 Set Collision Enabled。

注意 AI 的 Sphere 要将 Collision Presets 设置为 NoCollision,否则死亡的时候会被打飞出去,一直飞。

死亡炸飞身边的怪物

在敌人上加一个 Radial Force 的组件,然后在该组件的 Details 面板中进行如下设置:

1、在 adial Force Component 分类下,设置 Radius

2、在 Impulse 分类下,设置 Impulse Strength

调试阶段,可以设置大一些,方便看到效果;后面再设置为合适的值

死亡时,给周围一个爆炸伤害

2 小时 56 分

声音处理

击中的声音

1 小时 39 分到 1 小时 45 分是录制音乐,略过。

播放音乐是用的 Play Sound at Location这个节点。

增加衰减效果

在 Sound->新建 SoundAttenuation

Attenuation:/əˌtenjuˈeɪʃn/ 衰减

增加音调随机变换

在音频文件上右键,增加一个 Cue,然后编辑 Cue,增加一个 Modulator,设置下 Pitch Min 和 Pitch Max。

然后回到 AI 的蓝图,将 Play Sound at Location 的 Sound 设置为刚才添加的 Cue,就可以生效了。

随机生成敌人

从 2 小时开始。

思路:在玩家看不到的地方生成敌人。

提到了一个,求生之路里面,有讲到如何基于压力情绪生成丧尸,待学习。

注意,Set Timer by Event 一定要勾选上 Looping,否则执行一次就不执行了!这里我折腾了好久。

可以利用 Draw Debug Point来帮助调试,看看我们生成的点对不对;还有一个就是 Print String 打印出来点的坐标信息。

为什么生成的敌人不动?

这里还有一个要注意的地方,就是敌人的蓝图的 Class Defaults 中,需要将属性面板的 Pawn 下面的 Auto Process AI 从 Placed in World 改为 Placed in World or Spawned。

生成怪物 wave 和控制每次生成的怪物数量

Wave&Count

1:32 敌人死亡消失、击中飙血

1:38 声音,play sound at location 节点、死亡声音

1:51 死亡特殊烟雾效果、死亡人趴地上

2:00 多个敌人,有策略的放置敌人

地图

通过 BSP 创建简单地形

2:30 开始

可以用系统的 Geometry 搭建简单场景,快速试验玩法;后期再让设计师细化场景。

可以下载 Unreal tournament 这个里面的 Example Map,这是给开发者用的地图,各种东西都有。

2:50 加一个童话风格的地图

2:56 死亡时,给周围一个爆炸伤害

设置编辑器和游戏的默认地图

在 Project Setting 中进行设置。

背景音乐

通过关卡蓝图设置,注意只支持 wav 格式文件,且需要创建 Cue,设置其 looping,才能循环播放。

https://www.gongyesheji.org/?p=1018

用户界面

通过 User Interface->Widget Blueprint 创建。

注意如果需要绑定到变量,要把空间右侧顶部的转为变量勾选上。

创建的控件,应该在关卡蓝图中使用,并且记得添加到视口(控件是不能直接拖动到场景中的)

几个常用的节点:

获取某个 Actor:Get Actor of Class (用于在控件中获取某个 Actor,绑定其属性)

创建控件:Create Widget (在关卡蓝图中使用控件)

添加到视口:Add to Viewport

注意:进度的计算,要先转为 float,否则直接 int 除以 100,在打够 100 个之前,进度都是 0

(TODO)游戏结束界面

我是在 Character 中添加结束的逻辑和 UI 控件的。

<span style="color:red">我现在在这里写死了杀死 10 个敌人就结束游戏,后面需要改为动态判断。

另外结束游戏后,我没有停止角色的操作,还可以继续射击,这个需要在结束游戏后,中断角色的事件响应。

(TODO)技能 CD

https://www.bilibili.com/video/BV1uK411H7r4/?spm_id_from=autoNext

加入新的地图

迁移地图资产

放入 Director

添加 Navigation

不添加这个,敌人是不会寻路的,也就不会动了。

将之前的关卡蓝图中的内容,复制到新的关卡蓝图中

调试

暂停调试

Play 中,进行到你想调试的时候,按下暂停,然后进入对应的蓝图页面,鼠标移动到变量上,就可以看到当前的变量值了,很方便。

暴露变量

比如敌人的血量,测试的时候经常需要调整到 1

选中变量,右侧选择 Instance Editable 和 Expose on Spawn,这样在其他蓝图(比如 Director)中 Spawn 这个怪物的时候,就可以设置该属性了(如果之前已经存在该节点了,那么切换下 Class 就会出现刚刚暴露的属性了)。

然后在应用该变量的蓝图中,将这个属性再暴露为一个变量,勾选 Instance Editable,这样就可以直接在主编辑页面修改这个属性,用于测试了。

这个就完全是类的设计嘛:

1、Enemy 类有个 Health 属性,但是敌人不会在最终的场景类中直接生成

2、Director 类自己有个参数 Health,通过该参数实例化 Enemy

3、Level 类有 Director 的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Enemy {
constructor(Health) {
this.Health = Health;
}
}

class Director {
constructor(Health) {
this.Health = Health;
}

generateEnemy() {
new Enemy(this.Health);
}
}

class Level {
constructor() {
this.Director = null;
}
generateDirector(Health) {
this.Director = new Director(Health);
}
}

重置位置-掉到地面以下的时候用

搜索 camera,选择一个点一下就可以了。这样下次启动游戏,你就从这个 camera 的位置出现。

真机模拟

编辑器 play 有个模拟真机的模式,如果打包后有问题,可以试试开启这个模式调试下,看有没有报错信息。

游戏中打开控制台

打包后的游戏,按~键可以打开控制台,进行命令行调试。

比如手动切换地图:

1
open you_map_name

还可以在启动游戏的时候指定地图:

1
MyGame.exe /Game/Maps/MyMap

资料

https://www.bilibili.com/video/BV1Dg4y1b7aA?p=49