在之前的基础之上,本节将为敌人增加血条,先创建一个UserWidget。

排版将其放在最中心。

在敌人的蓝图中添加Widget组件,并如下设置

Space设置为Screen,保证主角在任何角度能够看到血条。

WidgetClass选择刚才创建好的UI。

设置完成后在ViewPort中将血条调整到适合的位置。

此时就可以看到血条出现在敌人头上。

接下来就是改变血量数据,当敌人遭遇打击时候,头上血条数据会减少。

在AttributeSetBase类中,新建一个FGameplayAttributeData类型的数据,起名为MaxHealth。该血量是不会变的,是总血量。

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AttributeSetBase.generated.h"/*** */DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FHealthDelegate, float, Health, float, MaxHealth);UCLASS()
class SHIBI_API UAttributeSetBase : public UAttributeSet
{
public:GENERATED_BODY()UAttributeSetBase();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Properties From AttributeSetBase")FGameplayAttributeData Health;FGameplayAttributeData MaxHealth;FHealthDelegate onHealthChangeDelegate;void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override;
};

设置一个动态多播代理,用来代理Health与MaxHealth数值的变化。

当敌人承受的技能打击之后,发生的血量变化,所以我们需要在PostGameplayEffectExecute方法中进行数据的发送。

// Fill out your copyright notice in the Description page of Project Settings.#include "AttributeSetBase.h"
#include "GameplayEffectExtension.h"
#include "GameplayEffect.h"UAttributeSetBase::UAttributeSetBase():Health(200.0f), MaxHealth(200.0f){}void UAttributeSetBase::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{if (Data.EvaluatedData.Attribute.GetUProperty() == FindFieldChecked<UProperty>(UAttributeSetBase::StaticClass(),GET_MEMBER_NAME_CHECKED(UAttributeSetBase,Health))) {onHealthChangeDelegate.Broadcast(Health.GetBaseValue(),MaxHealth.GetCurrentValue());}
}

在主角中加入两个方法,这两个方法仅仅用作对比。上面的一个方法是普通的宏定义,下面的方法是将其实现交给了蓝图。

 UFUNCTION(BlueprintCallable)void OnHealthChanged(float Health, float MaxHealth);//该方法在蓝图中去实现UFUNCTION(BlueprintImplementableEvent)void K2_OnHealthChanged(float Health, float MaxHealth);

在主角CPP文件中是这样的:

void AShinbi::OnHealthChanged(float Health, float MaxHealth) {K2_OnHealthChanged(Health, MaxHealth);
}
attributeComponent->onHealthChangeDelegate.AddDynamic(this,&AShinbi::OnHealthChanged);

在主角的属性组件中,找到代理,添加动态关联事件。当敌人的生命值发生改变的时候,将Health和MaxHealth值进行了传递,通知了OnHealthChangeDelegate所绑定的OnHealthChanged事件,OnHealthChanged事件实际执行的是K2_OnHealthChanged事件,但是该事件是被要求在蓝图中完成的。

打开敌人的蓝图,如下设置。

此时我们运行游戏,在对敌人产生攻击的时候,会发现血条发生了变化。

这里在多说一句,在代理中(不带参数):

DECLARE_DELEGATE(FDelegate) 单播代理用到的是BindUObject与ExecuteIfBound。

DECLARE_MULTICAST_DELEGATE(FDelegate) 多播代理用到的是FDelegateHandle对象,以及AddUObject与Broadcast。

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDelegate) 动态多播代理用到的是AddDynamic与Broadcast。

DECLARE_EVENT(UClass,DelegateName)  自定义事件用到的是AddUObject与Broadcast。

Unreal Engine 4 —— GAS系统学习 (八) 为敌人增加血条并关联伤害数据相关推荐

  1. Unreal Engine 4 —— GAS系统学习 (二十八) 创建Lazer招式与GameplayEffect

    欢迎大家加入Unreal Engine C++ & Blueprint群一起交流:1143575617 为Lazer招式新建一个GA招式,继承自BP_GameplayAbility,这个类是前 ...

  2. Unreal Engine 4 —— GAS系统学习 (二十一) 为主角添加技能图标

    欢迎大家加入Unreal Engine C++ & Blueprint群一起交流:1143575617 本节为主角的治疗技能添加上图标到插槽中. 先准备好技能图标,新建一个Material,按 ...

  3. Linux系统学习 八、SSH服务—SSH远程管理服务

    1.SSH简介 ssh(安全外壳协议)是Secure Shell的缩写,是建立在应用层和传输层基础上的安全协议.传输的时候是经过加密的,防止信息泄露,比telnet(明文传递)要安全很多. ftp安装 ...

  4. python异步框架twisted_Python学习八十七天:使用异步的twisted框架写入数据

    1.twisted框架介绍 Twisted是用Python实现的基于事件驱动的网络引擎框架: Twisted支持许多常见的传输及应用层协议,包括TCP.UDP.SSL/TLS.HTTP.IMAP.SS ...

  5. 游戏音频技术备忘 (五)Wwise Unreal Engine 集成代码浅析 二

    AkAmbientSound类的实现 Unreal Engine提供了一个基本对象的构造器ObjectInitializer,一般来说用户创建的类总是拥有很多变量,因此 AkAmbientSound  ...

  6. linux中ftp的工作原理,Linux系统学习 十二、VSFTP服务—简介与原理

    1.简介与原理 互联网诞生之初就存在三大服务:WWW.FTP.邮件 FTP主要针对企业级,可以设置权限,对不同等级的资料针对不同权限人员显示. 但是像网盘这样的基本没有权限划分. 简介: FTP(Fi ...

  7. 系统学习javaweb-06-javascript

    系统学习javaweb-06-javascript 系统学习javaweb-06-javascript 变量与数据类型 1 javascript的数据类型 2 数据类型转换 运算符 控制语句 循环语句 ...

  8. Unreal Engine 4 学习总动员读书笔记

    Unreal Engine 4 学习总动员读书笔记 参考<Unreal Engine 4 学习总动员>,按照里面的录制的视频一步一步的操作,并将操作的流程和关键截图保存下来,方便后面的再次 ...

  9. 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)

    通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...

最新文章

  1. 中国世界工厂地位为什么不会动摇
  2. ios 工具大全,最全框架
  3. 微软遭遇滑铁卢,chrome成为最受欢迎浏览器
  4. mysql 数据库属性_mysql 查看数据库属性
  5. 基于Udp的Socket网络编程
  6. 运维监控软件 wgcloud 更新,v3.2.7 重构告警模块
  7. 上海交大计算机系王楠,交通学院本科生学生组织干部名单
  8. oracle存储过程执行中输出日志文件 (转载学习)
  9. 谷歌浏览器所有页面都崩溃,设置都崩溃
  10. 汽车行业DMS系统介绍
  11. 【大连理工大学】计算机专业选修:深度学习2020期末复习
  12. 高仿绚丽彩虹悬浮音乐播放器html5源码
  13. 关于HTML实现拖放时出现禁止图标的解决方案
  14. 启动计算机时进入bios界面,电脑开机就进入bios界面怎么办
  15. 约瑟夫问题-输出最后的编号
  16. adobe cs5全线作品
  17. oracle ebs用什么开发,ORACLEERP开发基础之EBS开发基础
  18. 1.2 行列式的性质和计算
  19. Kafka的数据是如何存储的
  20. 企业信息化系统CRM篇

热门文章

  1. Python —— 破解 wifi 密码
  2. sigmaplot作图中图形的说明标签大小间隔调整
  3. MVC-缓存OutputCache特性
  4. 《士兵突击》经典语录
  5. 【AI】Simulated Annealing 模拟退火算法
  6. 如何培养团队合作能力、精神
  7. PS练习5——给老照片上色
  8. 穿越火线 CF 错误代码3025-6 进不去游戏案例!
  9. 使用jxl导入excel文件 读取带有有效性的excel数据,遇到的问题
  10. 全新平台VS2010