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

原文作者:@玄冬Wong

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

 

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

 

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

Cpp代码   收藏代码
  1. UCLASS()  
  2. class MYPROJ_API AMyGameMode : public AGameMode  
  3. {  
  4.     GENERATED_BODY()  
  5.       
  6. public:  
  7.   
  8.     AHGameMode();  
  9.   
  10.     //定义Event  
  11.     DECLARE_EVENT(MyUObject, MyInitEvent)  
  12.       
  13.     //用于获取Event引用的函数,方便在GameMode之外执行binding  
  14.     MyInitEvent& OnInitialize() { return InitEvent; }  
  15.       
  16. private:  
  17.     //Event实例化  
  18.     MyInitEvent InitEvent;  
  19.       
  20.     //Event的binding指针  
  21.     FDelegateHandle DHandle;  
  22. }  

 

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

Cpp代码   收藏代码
  1. MyUObject* MyObj = NULL;    //这里假设创建MyUObject  
  2. if (MyObj)  
  3. {  
  4.     DHandle = MyGameMode->OnInitialize().AddUObject(MyObj, &MyUObject::TestFun);  
  5. }  

 

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

 

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

Cpp代码   收藏代码
  1. void AMyGameMode::BeginPlay()  
  2. {  
  3.     InitEvent.Broadcast();  
  4. }  

 

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

Cpp代码   收藏代码
  1. MyGameMode->OnInitialize().Remove(DHandle);  
在Unreal Engine 4 (UE4) 中,如果你想在蓝图(Blueprint)上注册Android事件接收委托(Delegate),你需要做以下几个步骤: 1. **创建委托(Delegate)**:首先,在蓝图工具里,右键点击“Functions”选项卡,选择“Create” > “New Delegate”,然后给它一个描述性的名称,例如“OnAndroidEventReceived”。 2. **声明委托**:在蓝图的函数或类属性中,将这个委托作为参数或返回值。这可以让你的蓝图知道何时需要触发此委托。 ```ue4blueprint UPROPERTY(BlueprintCallable, Category = "Events") void RegisterForAndroidEvent(FOnAndroidEventReceived Callback); ``` 3. **注册回调函数**:当你想要监听某个Android事件时,比如接收到消息,会在蓝图中调用`RegisterForAndroidEvent`函数,并传入一个处理该事件的实际函数。这个函数将会在Android事件发生时被自动调用。 ```ue4blueprint void YourFunctionThatSendsToAndroid() { FOnAndroidEventReceived Handler = SayHelloFromAndroid; // AndroidEventReceiverComponent->RegisterForAndroidEvent(Handler); // 如果你在组件上注册 MyAndroidManagerComponent.RegisterForAndroidEvent(Handler); // 或者在特定模块的组件上注册 } ``` 4. **处理事件**:在Android应用那边,当事件发生时,会调用在UE4中注册的那个处理函数,通过传递给`RegisterForAndroidEvent`的回调。 5. **解绑委托**:当不再需要接收事件时,记得从组件上解除绑定,如`MyAndroidManagerComponent.UnregisterForAndroidEvent(Handler)`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值