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

  • 相关阅读:
    微信网页授权功能来获取用户信息(昵称或头像)之php实现
    你人生的那口井挖好了吗?
    java项目打jar包
    Oracle 客户端配置笔记
    资源管理右键卡住的问题
    Java Web 项目学习(二) 开发注册功能
    Java Web 项目学习(三) 过滤敏感词 前缀树 反射 类加载
    Java Web 项目学习(二) 检查登录状态
    Java Web 项目学习(二)账号设置
    Java Web 项目学习(二) 显示登录信息
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/7728177.html
Copyright © 2011-2022 走看看