zoukankan      html  css  js  c++  java
  • [UE4] C++实现Delegate Event实例(例子、example、sample)

    转自: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);  

    如何用蓝图实现Delegate Event:

    当前例子使用的版本是v4.10,演示的内容包括:

    按下字母键时,去调用事先绑定好的Event Dispatcher,在这个Event Dispatcher中,来实现修改一个widget蓝图中一个button组件的文本。

    1,先在Project Settings中添加一个输入动作,名字为TestOutStr,按下V键时触发。

    2,在蓝图脚本中实现调用Event Dispatcher的操作。

    这里已经建好了一个PlayerController的蓝图,名字叫:MyPlayerController_BP。打开这个蓝图后,新建一个变量:NewVar_0,string类型,默认值为“BBBB”,我们将会把这个“BBBB”字符串传递到后面定义的Custom Event中,让button的文本显示为“BBBB”;

    再新建一个Event Dispatcher,名字叫:UpdateBtnTxt,我们需要传递参数,所以为这个Event Dispatcher新建一个String参数,参数名为NewString。

    3,这个MyPlayerController_BP蓝图的逻辑具体如下:

    当按下V键时,会触发UpdateBtnTxt这个事件,同时在屏幕中打印一句“Press V++++”来测试调用Dispatch Event是否执行过。

    4,在事先建好的Widget蓝图中添加一个button和一个Text组件,这个button的ID为Button_Txt,后续蓝图中会用到这个ID,Text组件的默认值为AAAA,结构如下图所示:

    5,打开Widget蓝图的Graph面板,右键新建一个Custom Event

    6,这个Custom Event名字起为ChangeTxtEvent,由于要接受MyPlayerController_BP蓝图中传递过来的string类型参数,所以这里也新建一个string类型参数,名字为NewParam。

    7,最后用蓝图node来连线实现逻辑,我们在Event Construct事件中绑定了事先定义好的Event Dispathcer:UpdateBtnTxt。

    MyPlayerController_BP蓝图中调用UpdateBtnTxt时,则会触发Widget蓝图的Custom Event:ChangeTxtEvent,从而来修改button的文本。

    参考资料:

    UE4 Event Dispatchers

    https://www.youtube.com/watch?v=k-MAALv3P-Y

    Event Dispatchers

    https://docs-origin.unrealengine.com/latest/INT/Engine/Blueprints/UserGuide/EventDispatcher/index.html

  • 相关阅读:
    从零开始入门 K8s | 应用编排与管理
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    203. Remove Linked List Elements
    183. Customers Who Never Order
    182. Duplicate Emails
    181. Employees Earning More Than Their Managers
    1261. Find Elements in a Contaminated Binary Tree
    1260. Shift 2D Grid
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/7728177.html
Copyright © 2011-2022 走看看