纯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));
}
相关推荐
1204157137 肖哥10 小时前
UE5.7 场景打光管线流程_【雪山】
ue5
weixin_4046793111 小时前
虚幻5 替代小白人角色的完整逻辑
ue5
1204157137 肖哥3 天前
UE5.7 灯光详解
ue5
狂云歌4 天前
AI写UE的3Dgame
人工智能·3d·ue5·游戏程序
日月云棠8 天前
UE5源码分析之Editor——Blutility模块全面分析
ue5
日月云棠8 天前
UE5源码分析之Editor——BehaviorTreeEditor模块全面分析
ue5
日月云棠8 天前
UE5源码分析之Editor——AssetTagsEditor模块全面分析
ue5
远离UE49 天前
UE5 显存 虚拟内存 深入学习笔记
笔记·学习·ue5
日月云棠9 天前
UE5源码分析之Editor——AnimationSettings模块全面分析
ue5
远离UE410 天前
UE5 SF_VertexShader 如何使用
ue5