野外生存游戏【5. 玩家资料】

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

UE版本:5.2.1

玩家伤害

预期效果:可以攻击其他玩家,并设计一个状态框,实时展示玩家状态

image-20231013105940954

UI层

首先创建一个 W_PlayerStatsWindow 组件,用于展示目前的玩家状态

image-20231013110038806

将这个 widget 放到 main_widget 里面

image-20231013111014402

接着新建一个结构体和一个枚举,用于存储和传递玩家资料

image-20231013110706818

image-20231013110757899

然后在刚刚创建的 widget 里面新建一个自定义事件,用于更新组件内容

image-20231013110112008

逻辑层

打开之前的斧头蓝图(BP_TP_Hachet),补充上人物伤害相关的逻辑

image-20231013110606643

打开 playercontroller,创建一个调用 widget 的事件

image-20231013110928788

最后在 BP_FirstPersonCharacter 里完善接收伤害相关的逻辑就好了

新建一个 PlayerStats 的变量,用于存储玩家的初始状态

新建一个 ApplyDamageToPlayer 函数,用于应用伤害

image-20231013111221579

最后调用 UE 的 Event AnyDamage 就可以了

image-20231013111338320

饥饿与缺水

预期效果:游戏运行过程中玩家会不断消耗食物和水源,当食物或水源消耗完毕之后就会开始损耗健康,并有通知提示应该去吃饭或者喝水了

image-20231014100314428

UI层

首先创建一个通知 widget,命名为 W_StatsNotificationWidget

并创建一个淡入淡出的动画

image-20231014101516256

在这个 widget 中,写一个构造函数,当 widget 被创建出来的时候就播放动画,同时根据参数决定应该展示缺水通知还是饥饿通知

image-20231014101927405

然后将这个 widget 加到 main_widget 里面

image-20231014102822508

并创建相关事件

image-20231014102915918

按照流程,widget 准备好了之后,下一步就应该来到 PlayerController 里面创建事件调用了

image-20231014102050155

逻辑层

UI 层准备完毕之后,来到 BP_FirstPersonCharacter 中实现相关逻辑

首先是要定时扣除食物和水源

先来创建一个函数,用于根据扣除速度来做减法

image-20231014102249508

扣除健康度

创建一个自定义事件,用于判断当角色饥饿或者缺水时,扣除健康值

image-20231014103352929

这里的 Remove Health 就是简单的 apply damage

image-20231014103438538

再做一点优化,打开之前的 Apply Damage to Player 函数,加上一个死亡判定

image-20231014103524888

扣除食物和水源

上面逻辑准备好了之后再创建一个核心的 Food Water Drain 函数,根据玩家初始值扣除相应的food 和 water

如果扣空了,就记录状态,并展示通知,同时开始扣除生命值

image-20231014102541714

image-20231014102614065

Food Water Drain 函数中的定时器,是在外面的自定义事件中创建的

image-20231014102514604

那么到这里,饥饿与缺水这部分的逻辑就基本完成了

体力消耗

这个功能要达到的预期效果是:当玩家跑步的时候,就消耗体力;当玩家停止时,就恢复体力

主要逻辑是监控玩家输入,当玩家按下按钮开始运动时,判断玩家的移动速度,如果大于100,就匀速消耗体力;如果小于一百,或松开移动键时,就开始恢复

image-20231017122342566

image-20231017122359100

这里具体的事件逻辑如下

image-20231017122509484

扣除耐力点的逻辑如下

image-20231017122605549

恢复耐力点的逻辑如下

image-20231017122638115

短跑

首先在 BP_FirstPersonCharacter 中创建一些修改最大进行速度的事件,要求按下 Left Shift键,角色就可以加速短跑

image-20231019101806725

然后改进一下消耗耐力的逻辑,当耐力消耗到一定程度一周,就修改角色的最大移动速度

image-20231019102048480

恢复耐力的逻辑也是一样,当角色的耐力恢复之后,就提高最大移动速度

image-20231019102150008

最后补充一下上面缺失的两个状态同步事件即可

image-20231019102244197