第十章 Survival Game Mode
2-Game Mode Test Map
- 设置游戏规则进行游戏玩法
- 生成敌人
- 玩家是否死亡
- 敌人死亡
- 是否需要刷出更多
- 肯定:难度增加
- 否定:玩家胜利
- 流程
- 新的游戏模式类
- 游戏状态
- 新的数据表来指定总共有多少波敌人
- 生成逻辑
- UI告诉当前玩家的敌人波数
3-Survival Game Mode Class
- 新建继承一开始的游戏规则基类新的游戏规则
- 创建这个游戏模式的蓝图
4-Enemy Wave Spawner Table Row
- 继续定义逻辑,定义每波数敌人的信息
- 定义波次生成表格行结构体
- 创建我们定义的这个数据表格
- 将这个每波生成敌人的信息数据添加到游戏模式中
5-Wave Progression Logic(生成波数逻辑)
- 生成敌人规则的逻辑所需的变量与逻辑
6-Wave Count Down Widget
- 修改上面的两个不严谨的地方
- 添加宏可以在蓝图中查看
- 这里应该直接大于就行了,不应该有等于
- 这节课做开始产生新的波数的UI
7-Drawing Wave Count Down Widget
- 在GameMode中新建一个函数用来创建显示UI
- 显示UI
- 更新速度很快,导致倒计时,到0时可能出现负数情况bug,解决方法
8-Wave Info Widget
- 继续做UI
- 继续创建新的函数用来显示生成新的一波UI
- 播放完第一个UI后,应该播放第二个UI,但是没有播放,原因是我们游戏模式默认没有启用Tick,要自动启动Tick
9-Pre Load Next Wave Enemies(预加载下一波敌人)
- 这节课来处理生成敌人逻辑
- 由于我们在结构内部使用软指针,这意味着我们需要手动加载敌人类,并且这样做的时机至关重要,因为我们不知道有多少个类指针,如果我们在生成时就开始异步加载就太晚了,所以我们需要预加载敌人,所以我们的异步加载需要在生成之前
- 在关卡中生成敌人
- 处理生成计数
- 新建一个预加载敌人的函数与一个获取生成数据表格数据的辅助函数
- 以及存储预加载敌人的Map
- 调用预加载敌人函数位置
- 测试结果
10-Try Spawn Wave Enemies
- 继续写生成敌人的逻辑,新建尝试生成敌人的函数与是否持续生成敌人的辅助函数
- 新建所需计数的变量
- 生成逻辑
- 在之前未做处理的生成敌人的位置调用此函数
11-On Enemy Destroyed
- 先解决之前遗漏的一些小细节,每次预加载敌人应该清空一下存储的Map
- 这节课来解决上节课,当杀死敌人后,不会产生新的敌人
- 为了不断生成敌人,游戏模式需要知道敌人何时死亡
- 绑定Actor的当销毁时的委托事件进行处理
12-On Wave Completed
- 当完成一波等待是否有下一波,如果没有就结束打印一下测试
- 添加一波
13-Playtesting Game Mode(测试游戏模式)
- 这节课修改了一下远程敌人入场的bug,远程敌人入场就会攻击,没有播放进场动画,原因就是因为行为树开始就执行攻击能力了,我们应该把停止所有逻辑的中止器改为
LowerPriority
14-Register Spawned Enemies
- 这节课解决,Boss召唤小弟后,Boss死亡,小弟还未死亡时,UI还是会进入这波结束的状态,这是因为我们的游戏规则对Boss召唤的敌人一无所知导致的
- 注册生成的敌人
- 在Boss的召唤小弟能力中进行调用此函数
15-Notify Last Wave
- 解决一下细节问题,Boss出现时的血条与名字UI会提前出现与我们的波数UI进行相重叠
- 因为这两个动画播放时间有2.35秒
- 但是我们生成敌人的延迟时间只有2秒
- 解决方法很多,这里缩短一下动画时间就行
- 这节课来解决,当玩家到最后一波时,在屏幕上显示该信息
- 修改一下敌人生成的延迟时间为蓝图中可写
- 最后一波的显示UI
- 到这里游戏规则的有效游戏循环基本都处理了,唯一的就是角色的死亡还没有做处理
16-On Player Died
- 在玩家死亡能力中,结束死亡能力时调用游戏状态改变的委托
- 测试
- 运行结果
17-Game Difficulty
- 这节课来实现游戏的难度设置
- 到目前位置我们的游戏能力等级都默认为1,这节课来处理根据游戏难度来设置游戏能力的等级
- 首先新建难度的枚举类型
- 在游戏规则的基类中定义这个变量,并且提供公有接口获取
- 在角色类中初始化能力数据时进行传递当前难度的决定能力等级逻辑
- 在敌人初始化能力中就将难度的等级设置与角色相反
18-Verify Game Difficulty
- 验证游戏难度