纯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));
}
相关推荐
邪修king10 小时前
UE5 C++ 游戏性能优化:大一也能学会的实战级优化指南
c++·游戏·ue5
HAPPY酷1 天前
[UE5 避坑指南] 为什么打包后 UI 消失了?Launch Game 与强制加载
java·ui·ue5
晴夏。3 天前
unlua实现原理
游戏·ue5·ue4·lua·ue·unlua
晴夏。4 天前
UE Spawn出来的Actor的生命周期和管理方法
游戏·ue5·ue4·ue
晴夏。4 天前
UE垃圾回收的全方面讲解(通俗易懂)【底层实现、触发方式、引用保持、优化、工具】
ue5·游戏引擎·ue·垃圾回收
邪修king4 天前
UE5:C++ 实现 游戏逻辑 ↔ UI 双向联动
c++·游戏·ue5
HAPPY酷5 天前
从Public到Private:UE5 C++类创建路径差异全解析
java·c++·ue5
1204157137 肖哥8 天前
UE5.7 Procedural Vegetation分析
ue5
半天法师8 天前
Bug 记录:UE 结构体转 JSON 时 Key 字段大小写异常 (Editor 与打包后表现不一致)
ai·ue5·json·bug
邪修king9 天前
UE5 零基础入门第四弹:UMG UI 系统入门,从静态界面到逻辑联动
c++·ui·ue5