UE5 C++ 动态单播放

一.声明

这个是非动态的声明方式

动态单播,需要把参数的名字也声明上,不仅仅只写参数类型。

cpp 复制代码
//动态单播 不支持载荷 函数签名到蓝图已经写好无法动态修改
DECLARE_DYNAMIC_DELEGATE_TwoParams(FDynamicTwo, FString, InName, int32, InMoney); //第一个也是代理的名字F开头

并且不支持载荷这种操作。

二.动态单播无返回值实例演示

1.声明需要带 分号 ";"

cpp 复制代码
DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams(int32 ,FWXDynamicRetTwoParam, FString, inName, int32, inNum);

2.在类里面声明这个类型

复制代码
	FWXDynamicTwoParam TestDyEvent;
cpp 复制代码
	ADynamicCast();
	UFUNCTION(BlueprintCallable)
	void InitXGDynamic(FWXDynamicTwoParam InDelegate);
	UFUNCTION(BlueprintCallable)
	void RealseXGDynamic();
	UFUNCTION(BlueprintCallable)
	void CallXGDynamic(FString InName,int32 InNum);

三个函数,暴露给蓝图。分别赋值给类,并执行 发报

3.绑定的方式

1.C++ 里绑定,使用BindFuntion()

强调一下,绑定的函数一点要参数一致,且加入反射系统(有UFUNCTION 宏)

委托变量,F开头的。可加可不加(有UPROPERTY宏),有时UE抽风就加,说不定就绑上了

2.蓝图里绑定就是用蓝图连上 CustomEvent

并在Init 里传入赋值。这个是在继承的蓝图类里绑定

4.最后都能 广播成功

cpp 复制代码
void ADynamicCast::CallXGDynamic(FString InName, int32 InNum)
{
	//UE_LOG(LogTemp, Warning, TEXT("%d"), InNum);
	if (TestDyEvent.IsBound())
	{
		bool ifHas = TestDyEvent.ExecuteIfBound(InName, InNum);
		int32 a = 0;
	}
	
}

关卡蓝图里测试即可

三.动态单播有返回值实例演示

1.声明和上面类似,只是加了Ret 字段

cpp 复制代码
DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams(int32 ,FWXDynamicRetTwoParam, FString, inName, int32, inNum);
cpp 复制代码
	FWXDynamicRetTwoParam TestEvent2;

2.实现

cpp 复制代码
	UFUNCTION(BlueprintCallable)
	void InitXGRetDynamic(FWXDynamicRetTwoParam InDelegate);
	UFUNCTION(BlueprintCallable)
	void RealseXGRetDynamic();
	UFUNCTION(BlueprintCallable)
	void CallXGRetDynamic(FString InName,int32 InNum);
cpp 复制代码
void ADynamicCast::InitXGRetDynamic(FWXDynamicRetTwoParam InDelegate)
{
	TestEvent2 = InDelegate;
}

void ADynamicCast::RealseXGRetDynamic()
{
	TestEvent2.Clear();
}

void ADynamicCast::CallXGRetDynamic(FString InName, int32 InNum)
{
	int32 retValue = TestEvent2.Execute(InName, InNum);
}

3.在蓝图里就要多一些步骤,不是直接CustormEvent连上不行,因为默认是没有返回值的。要用CreateEvent

并重写函数

4.在执行时可以有返回值,但这个在蓝图里看不到.

cpp 复制代码
void ADynamicCast::CallXGRetDynamic(FString InName, int32 InNum)
{
	int32 retValue = TestEvent2.Execute(InName, InNum);
}

5.测试

四.完整代码如下

cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DynamicCast.generated.h"
DECLARE_DYNAMIC_DELEGATE_TwoParams(FWXDynamicTwoParam,FString,inName,int32,inNum);
DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams(int32 ,FWXDynamicRetTwoParam, FString, inName, int32, inNum);

UCLASS()
class THIRDLEARN_API ADynamicCast : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ADynamicCast();
	UFUNCTION(BlueprintCallable)
	void InitXGDynamic(FWXDynamicTwoParam InDelegate);
	UFUNCTION(BlueprintCallable)
	void RealseXGDynamic();
	UFUNCTION(BlueprintCallable)
	void CallXGDynamic(FString InName,int32 InNum);
	UFUNCTION(BlueprintCallable)
	void GWXBindFunciotn();
	UFUNCTION(BlueprintCallable)
	void GWXPrint(FString InName, int32 InNum);
	


	UFUNCTION(BlueprintCallable)
	void InitXGRetDynamic(FWXDynamicRetTwoParam InDelegate);
	UFUNCTION(BlueprintCallable)
	void RealseXGRetDynamic();
	UFUNCTION(BlueprintCallable)
	void CallXGRetDynamic(FString InName,int32 InNum);

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

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


#include "DynamicCast.h"

// Sets default values
ADynamicCast::ADynamicCast()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

void ADynamicCast::InitXGDynamic(FWXDynamicTwoParam InDelegate)
{
	TestDyEvent = InDelegate;
}

void ADynamicCast::RealseXGDynamic()
{
	TestDyEvent.Clear();   //解绑
}

void ADynamicCast::CallXGDynamic(FString InName, int32 InNum)
{
	//UE_LOG(LogTemp, Warning, TEXT("%d"), InNum);
	if (TestDyEvent.IsBound())
	{
		bool ifHas = TestDyEvent.ExecuteIfBound(InName, InNum);
		int32 a = 0;
	}
	
}

void ADynamicCast::GWXBindFunciotn()
{
	//TestDyEvent.BindUFunction(this,FName(GWXPrint));
	TestDyEvent.BindUFunction(this,FName("GWXPrint"));
}

void ADynamicCast::GWXPrint(FString InName, int32 InNum)
{
	UE_LOG(LogTemp, Warning, TEXT("%s %d"), *InName,InNum);
}

void ADynamicCast::InitXGRetDynamic(FWXDynamicRetTwoParam InDelegate)
{
	TestEvent2 = InDelegate;
}

void ADynamicCast::RealseXGRetDynamic()
{
	TestEvent2.Clear();
}

void ADynamicCast::CallXGRetDynamic(FString InName, int32 InNum)
{
	int32 retValue = TestEvent2.Execute(InName, InNum);
}



// Called when the game starts or when spawned
void ADynamicCast::BeginPlay()
{
	Super::BeginPlay();
	//TestDyEvent.BindUFunction();
}

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

}
相关推荐
tankeven3 分钟前
动态规划专题(03):区间动态规划从原理到实践(未完待续)
c++·算法·动态规划
天若有情6737 分钟前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
大前端下的小角色1 小时前
UE5.6 Cesium 插件编译踩坑记录(UE 5.6 + MSVC 14.38 + CMake 3.31)
c++
feng_you_ying_li2 小时前
c++之哈希表的介绍与实现
开发语言·c++·散列表
xh didida2 小时前
C++ -- string
开发语言·c++·stl·sring
m晴朗2 小时前
测试覆盖率从35%到80%:我用AI批量生成C++单元测试的完整方案
c++·gpt·ai
无限进步_3 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
苏纪云3 小时前
蓝桥杯考前突击
c++·算法·蓝桥杯
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
模板template
开发语言·c++
charlie1145141913 小时前
通用GUI编程技术——图形渲染实战(二十九)——Direct2D架构与资源体系:GPU加速2D渲染入门
开发语言·c++·学习·架构·图形渲染·win32