[UE4] C++实现Delegate Event实例(例子、example、sample)

本文详细介绍了如何在Unreal Engine中使用蓝图实现DelegateEvent,包括定义、绑定、触发和移除事件的方法,并对比了Event与Delegate的区别及性能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关文章:

如何用蓝图实现Delegate Event:

http://aigo.iteye.com/blog/2269663

 

原文作者:@玄冬Wong

转载请注明出处:http://aigo.iteye.com/blog/2301010

 

虽然官方doc上说Event的Binding方式跟Multi-Cast用法完全一样,Multi-Cast论坛上也有很多例子,但是实际是不一样。。而且论坛上找不到相关例子。后来看了下runtime/core的源码,Event的binging方式如下(附上完整步骤):

 

1,先定义自定义Event,此例中我们定义在GameMode中,名字叫 MyInitEvent。例子中定义的是无参函数,如果需要带参数,官方doc讲的有

UCLASS()
class MYPROJ_API AMyGameMode : public AGameMode
{
	GENERATED_BODY()
	
public:

	AHGameMode();

	//定义Event
	DECLARE_EVENT(MyUObject, MyInitEvent)
	
	//用于获取Event引用的函数,方便在GameMode之外执行binding
	MyInitEvent& OnInitialize() { return InitEvent; }
	
private:
	//Event实例化
	MyInitEvent InitEvent;
	
	//Event的binding指针
	FDelegateHandle DHandle;
}

 

2,执行Binding。MyUObject::TestFun是需要被触发的函数,这里假设是一个普通的无参成员函数:

MyUObject* MyObj = NULL;	//这里假设创建MyUObject
if (MyObj)
{
	DHandle = MyGameMode->OnInitialize().AddUObject(MyObj, &MyUObject::TestFun);
}

 

注:任何UObject的普通函数都可以被设置为Event的回调函数,但如果函数是UFUNCTION,那么需要将AddUObject替换为AddUFunction

 

3,触发Event,这里假设在BeginPlay中触发:

void AMyGameMode::BeginPlay()
{
	InitEvent.Broadcast();
}

 

4,移除Event,比如之前bingding的event不想再触发了:

MyGameMode->OnInitialize().Remove(DHandle);

 

Event 和 Delegate 区别

Delegate 只能绑定一个回调函数,Delegate执行Execute()函数时,只会触发事先绑定的一个函数;Event可以绑定任意个函数,一旦执行Event的Broadcast()函数,所有回调函数按Add顺序依次执行。

Dynamic Multicast Delegate也可以同时绑定多个回调函数,但是其运行效率要比 Event 慢。

 

Event 和 Delegate 共同点

回调函数都不能有返回值。

 

Dynamic Delegate 与 常规 Delegate 区别

Dynamic Delegates 可以被序列化:即他们的注册函数可以通过名称查找获取,相比普通Delegate,速度要慢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值