纯C++事件

一、创建多播委托类型及对象

1、AUECpp_Sender.h

cpp 复制代码
	//声明一个参数多播委托的类型,一定要F开头
	DECLARE_MULTICAST_DELEGATE_OneParam(FUECpp_Broadcast, int);
	//创建对象
	FUECpp_Broadcast UECpp_Broadcast;

2、AUECpp_Sender.cpp

cpp 复制代码
	//发送广播
	UECpp_Broadcast.Broadcast(FMath::RandRange(0, 100));

二、订阅及取消订阅

1、AUECpp_Receiver.h

cpp 复制代码
protected:
	virtual void BeginPlay() override;

public:
	void OnReceived(int Param);	

2、AUECpp_Receiver.cpp

cpp 复制代码
#include "UECpp_Sender.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/Engine.h"
#include "TimerManager.h"

void AUECpp_Receiver::BeginPlay()
{
	Super::BeginPlay();
	//订阅
	AUECpp_Sender* PlayerPawn = Cast<AUECpp_Sender>(UGameplayStatics::GetPlayerPawn(this, 0));
	FDelegateHandle DelegateHandle = PlayerPawn->UECpp_Broadcast.AddUObject(this, &AUECpp_Receiver::OnReceived);

	//计时器
	FTimerHandle TimerHandle;
	auto Lambda = [PlayerPawn, DelegateHandle, this]()
		{
			//取消订阅
			PlayerPawn->UECpp_Broadcast.Remove(DelegateHandle);
			//取消指定类里所有订阅
			PlayerPawn->UECpp_Broadcast.RemoveAll(this->GetPrivateStaticClass());
			//取消所有订阅
			PlayerPawn->UECpp_Broadcast.Clear();
		};
	GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda(Lambda), 5.0f, false);
}

void AUECpp_Receiver::OnReceived(int Param)
{
	GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Green, FString::Printf(TEXT("%i"), Param));
}
相关推荐
清泓y13 小时前
UE5--VR与AR开发技术
ue5·ar·vr
日月云棠13 小时前
UE5 Lyra Messages 模块深度解析——从一条击杀消息看游戏事件系统的设计哲学
游戏·ue5
日月云棠2 天前
UE5 Lyra Input 模块:从手柄摇杆到技能释放,一条链路如何做到零耦合
ue5
日月云棠4 天前
UE5 Lyra源码分析——Audio_Analysis音频模块全面分析
ue5·音视频
成都渲染101云渲染66665 天前
2026云渲染平台哪个好?建筑、动画、UE5项目选择云渲染的3个关键标准
ue5
清泓y5 天前
UE 物理系统知识分享
面试·ue5·游戏程序
清泓y5 天前
UE移动开发技术面试题
android·面试·ue5·ue4·游戏程序
清泓y6 天前
UE基础知识与引擎架构面试题
面试·架构·ue5·ue4·游戏程序
mengzhi啊7 天前
UE5关卡切换 传统加载(阻塞)vs流式加载(非阻塞)。还有加载关卡3种办法
ue5
电子云与长程纠缠8 天前
UE中使用TGuardValue与TInlineComponentArray数据结构
开发语言·数据结构·学习·ue5·游戏引擎