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

    xiaoxiao2021-08-16  157

    原文作者:@玄冬Wong

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

     

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

     

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

    Cpp代码   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是需要被触发的函数,这里假设是一个普通的无参成员函数:

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

     

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

     

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

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

     

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

    Cpp代码   MyGameMode->OnInitialize().Remove(DHandle);  
    转载请注明原文地址: https://ju.6miu.com/read-676422.html

    最新回复(0)