野外生存游戏【5. 玩家资料】
野外生存游戏【5. 玩家资料】
鲸拓工作室本系列教程逻辑繁杂,细节很多,本文更多的是作为大纲指引和逻辑梳理,可能笔记中还存在部分操作上缺漏,还请多包涵,有意者可下载工程文件(SurvivalCraft_05)自行对照学习
UE版本:5.2.1
玩家伤害
预期效果:可以攻击其他玩家,并设计一个状态框,实时展示玩家状态
UI层
首先创建一个 W_PlayerStatsWindow 组件,用于展示目前的玩家状态
将这个 widget 放到 main_widget 里面
接着新建一个结构体和一个枚举,用于存储和传递玩家资料
然后在刚刚创建的 widget 里面新建一个自定义事件,用于更新组件内容
逻辑层
打开之前的斧头蓝图(BP_TP_Hachet),补充上人物伤害相关的逻辑
打开 playercontroller,创建一个调用 widget 的事件
最后在 BP_FirstPersonCharacter 里完善接收伤害相关的逻辑就好了
新建一个 PlayerStats 的变量,用于存储玩家的初始状态
新建一个 ApplyDamageToPlayer 函数,用于应用伤害
最后调用 UE 的 Event AnyDamage 就可以了
饥饿与缺水
预期效果:游戏运行过程中玩家会不断消耗食物和水源,当食物或水源消耗完毕之后就会开始损耗健康,并有通知提示应该去吃饭或者喝水了
UI层
首先创建一个通知 widget,命名为 W_StatsNotificationWidget
并创建一个淡入淡出的动画
在这个 widget 中,写一个构造函数,当 widget 被创建出来的时候就播放动画,同时根据参数决定应该展示缺水通知还是饥饿通知
然后将这个 widget 加到 main_widget 里面
并创建相关事件
按照流程,widget 准备好了之后,下一步就应该来到 PlayerController 里面创建事件调用了
逻辑层
UI 层准备完毕之后,来到 BP_FirstPersonCharacter 中实现相关逻辑
首先是要定时扣除食物和水源
先来创建一个函数,用于根据扣除速度来做减法
扣除健康度
创建一个自定义事件,用于判断当角色饥饿或者缺水时,扣除健康值
这里的 Remove Health 就是简单的 apply damage
再做一点优化,打开之前的 Apply Damage to Player 函数,加上一个死亡判定
扣除食物和水源
上面逻辑准备好了之后再创建一个核心的 Food Water Drain 函数,根据玩家初始值扣除相应的food 和 water
如果扣空了,就记录状态,并展示通知,同时开始扣除生命值
Food Water Drain 函数中的定时器,是在外面的自定义事件中创建的
那么到这里,饥饿与缺水这部分的逻辑就基本完成了
体力消耗
这个功能要达到的预期效果是:当玩家跑步的时候,就消耗体力;当玩家停止时,就恢复体力
主要逻辑是监控玩家输入,当玩家按下按钮开始运动时,判断玩家的移动速度,如果大于100,就匀速消耗体力;如果小于一百,或松开移动键时,就开始恢复
这里具体的事件逻辑如下
扣除耐力点的逻辑如下
恢复耐力点的逻辑如下
短跑
首先在 BP_FirstPersonCharacter 中创建一些修改最大进行速度的事件,要求按下 Left Shift键,角色就可以加速短跑
然后改进一下消耗耐力的逻辑,当耐力消耗到一定程度一周,就修改角色的最大移动速度
恢复耐力的逻辑也是一样,当角色的耐力恢复之后,就提高最大移动速度
最后补充一下上面缺失的两个状态同步事件即可