野外生存游戏【6. 消耗品】

本系列教程逻辑繁杂,细节很多,本文更多的是作为大纲指引和逻辑梳理,可能笔记中还存在部分操作上缺漏,还请多包涵,有意者可下载工程文件(SurvivalCraft_06)自行对照学习

UE版本:5.2.1

消耗品

数据准备

我们先创建两个结构,用于定义消耗品

image-20231021094618101

image-20231021094633313

再根据上面定义的结构体,创建一个数据表,用于存储消耗品的信息

其中 InstantEffect? 是表示该消耗品是瞬间恢复,还是随时间推移缓慢恢复

Row Name 则与 DT_Itmes 数据表对应,这里创建了一个浆果作为示例,在 DT_Itmes 中,浆果的 ID 为6,所以这里的 Row Name 也为6

image-20231021094713579

别忘了把 DT_Itmes 中,浆果的类型改成消耗品

image-20231021094930211

核心逻辑

我们在使用 Hotbar 里面的物品时,都会调用 Use Hotbar Function。所以这里就打开这个函数,补充消耗品的相关逻辑

image-20231021095151328

Consume Item Function 的逻辑如下:

  1. 根据传入的 Container 类型和索引,找到需要消耗的那个物品;
  2. 将这个物品的数量减1
  3. 根据这个物品,去查数据表,看这个物品能恢复哪些状态
  4. 创建一个循环,逐个恢复状态

image-20231021095646437

image-20231021095656823

上面的逻辑中用到了减物品的函数,我们需要在 Container 中补上,逻辑如下

image-20231021095817561

即时恢复

然后就是即时恢复的函数 Update Stat Instant,实现逻辑如下

  1. 根据类别,找到当前的状态值和最大状态值,然后加上数据表中定义的状态值(目的是恢复状态)
  2. 根据不同的类别,修改不同的状态,如果是食物或者水源,还需要解除对应的饥饿和缺水状态
  3. 最后统一更新UI

image-20231021100304437

image-20231021100328422

到此,即时恢复的逻辑就写好了

缓慢恢复

为了实现缓慢恢复,我们在事件图表中创建这么一个自定义事件

这个函数是通过不同的状态,设置不同的定时器来恢复,其中核心的定时逻辑如下:

Set Timer by Function Name 的逻辑是用于在指定的时间后执行特定的函数,那么我们就根据该消耗品能消耗的时间 Duration 和该消耗品能恢复的状态值,做一个除法。除出来的结果n,就代表了该消耗品,每隔n秒,就应该给角色恢复1点状态值,当已经消耗完了的时候,就应该停止恢复。

具体实现逻辑如下:

image-20231022095456823

其中三种状态的恢复逻辑基本类似,如下:

image-20231022100104472

image-20231022100118738

image-20231022100128119

定时逻辑和对应的调用创建完毕之后,我们再来补充一下上面函数中用到的更新状态和UI的逻辑,也很简单

image-20231022100449614

image-20231022100459523

最后,在使用消耗品的时候把上面的事件调用一下就好了

image-20231022100535983

统计信息

预期效果,将玩家的所有信息统计到一个widget里面

image-20231023093842008

首先创建一个 W_PlayerStat 进度条(这里面的text是和StatName相绑定的)

image-20231023093906348

并实现更新进度条的逻辑

image-20231023094024786

接着创建一个 W_PlayerInfoWindow, 用户统计汇总四个信息

image-20231023094142515

更新逻辑如下

image-20231023094204657

将该 Widget 添加到 W_Inventory 中

image-20231023094317875

最后将该事件应用在 PlayerController 中即可

image-20231023094233990