UE5 C++ 多播绑定执行演示

一.定义 与 思路

一对对的响应,这里就创建一个发送多播的Actor,和多个响应多播的Actor。这里我学到一个牛逼的,只要你遵循反射规则写好宏,哪怕你在一个cpp里面也可以创建,两个类。并且引擎里会显示出来。AXGMultiDelegateActor作为发播类, AXGMultiExecuteActor 作为执行函数响应类。

二.代码

AXGMultiDelegateActor发播类

1.首先声明多播,多播无返回值。多了FString的载荷

cpp 复制代码
DECLARE_MULTICAST_DELEGATE_OneParam(FXGMultiDelegate, FString);  //多播不存在返回值

2.让后在发报的类里面,添加多播。CallSimpleMuti里面就会进行发报Broadcast。

因为声明里有FString的参数所以,在发报的时候添加进去。Broadcast(TEXT("This is simple Multi"));

cpp 复制代码
UCLASS()
class GWXPJ_API AXGMultiDelegateActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AXGMultiDelegateActor();
	UFUNCTION(BlueprintCallable)
	void CallSimpleMulti();
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	FXGMultiDelegate multidele;
};
cpp 复制代码
// Sets default values
AXGMultiDelegateActor::AXGMultiDelegateActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;
	RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("LocationRoot"));
	
}

void AXGMultiDelegateActor::CallSimpleMulti()
{
	//multidele.IsBound();
	//multidele.IsBoundToObject();
	multidele.Broadcast(TEXT("This is simple Multi"));
}

AXGMultiExecuteActor 执行函数响应类。

1.Work作为响应函数,参数和 声明的一致

cpp 复制代码
UCLASS()
class GWXPJ_API AXGMultiExecuteActor : public AActor
{
	GENERATED_BODY()
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
//	virtual void EndPlay() override;
public:
	void Work(FString InString,int32 InHealth);  //载荷对应的绑定函数也要多加
	AXGMultiExecuteActor();
public:
	FGuid MyActorID;
};

2.BeginPlay里找到场景里的发报类,并且用AddUObject 进行绑定,这里是只放一个发报的。实现响应函数

响应函数就是,自己的ID号,和血量。

cpp 复制代码
//执行函数

void AXGMultiExecuteActor::BeginPlay()
{
	
	AActor* ActorPtr = UGameplayStatics::GetActorOfClass(this, AXGMultiDelegateActor::StaticClass());  //你需要先拿到,那个类。才能绑定到它那个广播
	if (AXGMultiDelegateActor* MultiDelePtr = Cast<AXGMultiDelegateActor>(ActorPtr))  //LocationActor会向单播的对象报道,我已经绑定好函数准备(注册),响应你的 呼叫
	{
		int32 Health = 100;
		MultiDelePtr->multidele.AddUObject(this, &AXGMultiExecuteActor::Work, Health);
	}
}

//void AXGMultiExecuteActor::EndPlay()
//{
//
//}

void AXGMultiExecuteActor::Work(FString InString, int32 InHealth)
{
	UE_LOG(LogTemp, Warning, TEXT("ID:[%s],InStr:[%s],Health:[%d]"), *MyActorID.ToString(),*InString,InHealth);
}

AXGMultiExecuteActor::AXGMultiExecuteActor()
{
	PrimaryActorTick.bCanEverTick = false;
	RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("LocationRoot"));
	MyActorID = FGuid::NewGuid();
}

测试结果,用法和单播类似。只是API变了,能有多个同时响应。这里就是三个

三.头文件和源文件

cpp 复制代码
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "XGMultiDelegateActor.generated.h"

DECLARE_MULTICAST_DELEGATE_OneParam(FXGMultiDelegate, FString);  //多播不存在返回值

UCLASS()
class GWXPJ_API AXGMultiExecuteActor : public AActor
{
	GENERATED_BODY()
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
//	virtual void EndPlay() override;
public:
	void Work(FString InString,int32 InHealth);  //载荷对应的绑定函数也要多加
	AXGMultiExecuteActor();
public:
	FGuid MyActorID;
};

UCLASS()
class GWXPJ_API AXGMultiDelegateActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AXGMultiDelegateActor();
	UFUNCTION(BlueprintCallable)
	void CallSimpleMulti();
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	FXGMultiDelegate multidele;
};
cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.


#include "XGMultiDelegateActor.h"
#include "Kismet/GameplayStatics.h"

// Sets default values
AXGMultiDelegateActor::AXGMultiDelegateActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;
	RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("LocationRoot"));
	
}

void AXGMultiDelegateActor::CallSimpleMulti()
{
	//multidele.IsBound();
	//multidele.IsBoundToObject();
	multidele.Broadcast(TEXT("This is simple Multi"));
}

// Called when the game starts or when spawned
void AXGMultiDelegateActor::BeginPlay()
{
	Super::BeginPlay();
}

// Called every frame
void AXGMultiDelegateActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

//执行函数

void AXGMultiExecuteActor::BeginPlay()
{
	
	AActor* ActorPtr = UGameplayStatics::GetActorOfClass(this, AXGMultiDelegateActor::StaticClass());  //你需要先拿到,那个类。才能绑定到它那个广播
	if (AXGMultiDelegateActor* MultiDelePtr = Cast<AXGMultiDelegateActor>(ActorPtr))  //LocationActor会向单播的对象报道,我已经绑定好函数准备(注册),响应你的 呼叫
	{
		int32 Health = 100;
		MultiDelePtr->multidele.AddUObject(this, &AXGMultiExecuteActor::Work, Health);
	}
}

//void AXGMultiExecuteActor::EndPlay()
//{
//
//}

void AXGMultiExecuteActor::Work(FString InString, int32 InHealth)
{
	UE_LOG(LogTemp, Warning, TEXT("ID:[%s],InStr:[%s],Health:[%d]"), *MyActorID.ToString(),*InString,InHealth);
}

AXGMultiExecuteActor::AXGMultiExecuteActor()
{
	PrimaryActorTick.bCanEverTick = false;
	RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("LocationRoot"));
	MyActorID = FGuid::NewGuid();
}
相关推荐
rainbow68895 小时前
Linux文件描述符与重定向原理
c++
CodeSheep程序羊6 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
编程小白20266 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
.小墨迹7 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
历程里程碑7 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴7 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
天若有情6737 小时前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
czy87874758 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
我在人间贩卖青春8 小时前
C++之继承的方式
c++·private·public·protected·继承方式
智者知已应修善业10 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法