当前位置: 首页 > news >正文

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录

  • 一、优化执行效率
  • 二、简单脉冲动画

一、优化执行效率

  1. 绑定事件需要每一帧检查绑定对象是否有变化,势必造成CPU资源的浪费,因此优化执行效率的思路是:UI组件不再自行每帧查询血量,而是让血量自己在发生变化的同时通知UI进行刷新。
  2. 多播委托Multicast Delegate)是一种特殊的委托类型,它允许多个函数绑定到同一个委托实例,当该委托被调用时,会依次调用所有绑定的函数。这在需要通知多个对象或系统某个事件发生时非常有用。

参考链接:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/delegates-and-lamba-functions-in-unreal-engine?application_version=5.2

(1)声明多播委托
SurAttributeComponent.h

#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "SurAttributeComponent.generated.h"// 发起者,控件拥有者,改变后的血量,变化值
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnHealthChanged, AActor*, InstigatorActor, USurAttributeComponent*, OwningComp, float, NewHealth, float, Delta);UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class SURKEAUE_API USurAttributeComponent : public UActorComponent
{GENERATED_BODY()protected:UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Attributes")float Health;public:USurAttributeComponent();// 声明一个多播委托实例UPROPERTY(BlueprintAssignable)FOnHealthChanged OnHealthChanged;// 要触发的函数UFUNCTION(BlueprintCallable, Category="Attributes")bool ApplyHealthChange(float Delta);}; 

(2)触发多播委托
SurAttributeComponent.cpp

#include "SurAttributeComponent.h"USurAttributeComponent::USurAttributeComponent()
{Health = 100;
}bool USurAttributeComponent::ApplyHealthChange(float Delta)
{Health += Delta;// 由多播实例触发多播委托,通知所有绑定的函数OnHealthChanged.Broadcast(nullptr, this, Health, Delta);return true;
} 

(3)绑定函数到多播委托

 MyCharacter->OnTakeDamage.AddDynamic(this, &AMyGameMode::OnCharacterTakeDamage);
  1. 回到UE,在PlayerAttributeComp中添加刚刚编写的OnHealthChanged事件,利用PrintString节点快速验证效果
    在这里插入图片描述
  2. 现在需要把这个事件分配给相应的UI控件PlayerHealth_Widget即可,绑定到血条(进度条)
  3. 在·PlayerHealth_Widget·的事件图表中编写蓝图程序,在“事件构造”一开始就将将玩家PawnAttributeComp绑定到OnHealthChanged事件上。在每次事件触发时计算当前血量与玩家默认血量的百分比,并设置给进度条。此外,我还顺便设置了文本块显示的内容,并在设计器中取消了上一节实现的绑定函数。如果在蓝图中找不到文本框变量,记得在设计器中把相应控件前的Is Variable打开。

二、简单脉冲动画

  1. 此这部分通过在UI中添加血量减少时的脉冲动画,来了解UMG中动画的使用
  2. 在左下角的“动画”中点击“添加动画”,命名为PulseHealthAnim,点击动画,并选择旁边的“时间轴”。选择显示血量数字的文本块,在细节中下滑找到“渲染变换”,将缩放添加为关键帧
  3. 将时间轴拖拽到0.75,添加关键帧;在0.25处,将缩放的XY设置为0.5再次添加关键帧。此时拖动时间轴(或者按下空格键),就可预览到这个简易的脉冲动画。切换切换到蓝图中,添加播放动画的节点。
  4. 在刚才设置关键帧的时候更改了文本缩放的默认值,此时需要回到设计器中,点击黄色返回键将文本的缩放变为默认值

参考链接:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/animating-umg-widgets-in-unreal-engine?application_version=5.2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • spring常用注解有哪些
  • YOLOv5改进 | 注意力机制 | 二阶注意力网络来进行单图像超分辨率【附网盘完整代码】
  • 力扣SQL 最后一个能进入巴士的人 自连接
  • 【爱上C++】list用法详解、模拟实现
  • 放大电路总结
  • electron 网页TodoList工具打包成win桌面应用exe
  • lua 游戏架构 之 游戏 AI (九)ai_mgr Ai管理
  • Matlab M_map工具箱绘制Interrupted Mollweide Projection
  • 【React 】开发环境搭建详细指南
  • Java中的集合相关知识汇总
  • 【Go】探索 Go 语言的内建函数 copy
  • nacos2.x作为配置中心和服务注册和发现以及springcloud使用
  • linux离线安装mysql8(单机版)
  • 信息安全工程师题
  • K8s 核心组件——API Server
  • [译]Python中的类属性与实例属性的区别
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Docker: 容器互访的三种方式
  • Java Agent 学习笔记
  • JAVA SE 6 GC调优笔记
  • javascript数组去重/查找/插入/删除
  • js继承的实现方法
  • Netty 4.1 源代码学习:线程模型
  • Odoo domain写法及运用
  • Vue UI框架库开发介绍
  • 阿里云前端周刊 - 第 26 期
  • 包装类对象
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 反思总结然后整装待发
  • 区块链共识机制优缺点对比都是什么
  • 入门级的git使用指北
  • 思否第一天
  •  一套莫尔斯电报听写、翻译系统
  • AI算硅基生命吗,为什么?
  • kubernetes资源对象--ingress
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​浅谈 Linux 中的 core dump 分析方法
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • %check_box% in rails :coditions={:has_many , :through}
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (超详细)语音信号处理之特征提取
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (十三)MipMap
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)Java算法:二分查找
  • (一)基于IDEA的JAVA基础12
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Sublime Text3配置Lua运行环境
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core跨平台微服务学习资源
  • .Net语言中的StringBuilder:入门到精通
  • .net中调用windows performance记录性能信息
  • /etc/fstab 只读无法修改的解决办法