当前位置: 首页 > 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

http://www.lryc.cn/news/408949.html

相关文章:

  • 在生信分析中大家需要特别注意的事情​
  • Java工厂模式详解:方法工厂模式与抽象工厂模式
  • springSecurity学习之springSecurity用户单设备登录
  • 微信小程序实现聊天界面,发送功能
  • 【强化学习的数学原理】课程笔记--5(值函数近似,策略梯度方法)
  • 前端Long类型精度丢失:后端处理策略
  • C++ | Leetcode C++题解之第300题最长递增子序列
  • springboo 整合 redis
  • dpdk编译安装以及接收udp报文(基于ubuntu)
  • 【计算机网络】OSPF单区域实验
  • Java聚合快递小程序对接云洋系统程序app源码
  • 【React】详解组件通信:从基础到进阶的全面指南
  • 【vluhub】zabbix漏洞
  • openGauss触发器详解
  • 抄作业-跟着《React通关秘籍》捣鼓React-playground-上集
  • 80后最后的书信 年代
  • 软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点
  • Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。
  • 什么是NIO
  • PHP switch 替代品 match
  • FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言
  • 面试重点---快速排序
  • [MIT6.5840]MapReduce
  • 【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )
  • springboot,service 层统一异常抛出时,throws Exception写在接口上还是实现类上
  • 深度学习高效性网络
  • PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
  • Flutter Geolocator插件使用指南:获取和监听地理位置
  • 网站基本布局CSS
  • ssm框架整合,异常处理器和拦截器(纯注解开发)