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();
}
相关推荐
旖-旎14 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
Darkwanderor15 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽80815 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
REDcker15 小时前
libdatachannel 快速入门
c++·webrtc·datachannel
second6017 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴17 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm17 小时前
linux之线程概念和控制
linux·开发语言·c++
hehelm18 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip
hansang_IR18 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
会周易的程序员19 小时前
从零构建多核CPU负载自适应控制系统
linux·c++·笔记·物联网·测试工具