转自:http://blog.ch-wind.com/ue4-event-dispatcher-and-delegate/

事件调度器非常的适合在各个蓝图之间实现通信功能。

当前UE4版本4.8.3。

在蓝图中,事件调度器的作用就像是事件的派发器。通过将事件预先的绑定在事件调度器上,可以让系统可以在需要时将事件派发给所有已经绑定的事件。

事件调度器的使用

一个比较常见的使用事件调度器的地方,就是关卡蓝图。

关卡蓝图中的很多物体的Actor及其逻辑,如果要脱离关卡蓝图的话会比较难于使用。因此,可以通过将关卡蓝图中实现好的功能绑定到某个类,例如GameMode的事件调度器上来方便调度。

如下图,在关卡蓝图的BeginPlay中将功能绑定到GameMode上:

然后可以在GameMode的蓝图中,设定定时的调度关卡蓝图上的功能

事件调度器同时支持解绑和解绑全部,以方便对事件调度的逻辑进行进一步的控制。

Delegate

在C++和蓝图混合使用时,使用Blueprint Function Library可以方便的实现蓝图到C++的调用。如果要实现C++对蓝图的逻辑的话,事件调度机制就非常的方便。

在C++中,与事件调度器对应的是Delegate机制。事实上,Delegate机制的涵盖范围比事件调度器要大一些。

Delegate机制是一种常见的设计模式,相信做程序的童鞋都比较熟悉。这里不做多余的说明了。

UE4官方对Delegate的翻译名称唯代理。按照类型,分为单播代理和多播代理。其中,多播代理与事件调度器的功能类似,而单播代理更接近单纯的代理,也就是只能绑定一个执行函数。

要让多播代理像是事件调度器一样使用的话,需要将其定义为Dynamic。对于单播代理也是一样的。

在C++中使用UE4的代理功能,需要使用官方提供的宏进行定义。

函数签名 声明宏
void Function() DECLARE_DELEGATE( DelegateName )
void Function( <Param1> ) DECLARE_DELEGATE_OneParam( DelegateName, Param1Type )
void Function( <Param1>, <Param2> ) DECLARE_DELEGATE_TwoParams( DelegateName, Param1Type, Param2Type )
void Function( <Param1>, <Param2>, … ) DECLARE_DELEGATE_<Num>Params( DelegateName, Param1Type, Param2Type, … )
<RetVal> Function() DECLARE_DELEGATE_RetVal( RetValType, DelegateName )
<RetVal> Function( <Param1> ) DECLARE_DELEGATE_RetVal_OneParam( RetValType, DelegateName, Param1Type )
<RetVal> Function( <Param1>, <Param2> ) DECLARE_DELEGATE_RetVal_TwoParams( RetValType, DelegateName, Param1Type, Param2Type )
<RetVal> Function( <Param1>, <Param2>, … ) DECLARE_DELEGATE_RetVal_<Num>Params( RetValType, DelegateName, Param1Type, Param2Type, … )

针对不同的代理类型,使用不同的宏前缀即可:

多播代理 DECLARE_MULTICAST_DELEGATE…
动态单播代理 DECLARE_DYNAMIC_DELEGATE…
动态多播代理 DECLARE_DYNAMIC_MULTICAST_DELEGATE…

实际使用时,首先要对代理类型进行定义

DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FDspLRValDelegate, float, LVals, float, RVals);

然后在具体的类,例如GameState中进行具体的声明

UPROPERTY(BlueprintAssignable, Category = "SoundFuncs")
FDspLRValDelegate DspLRVals;

这样一来,就可以在需要调用这个代理的地方进行调用了,例如在某个数据生成的地方。

AMyGameState* tags = Cast<AMyGameState>(SL_Contex.LC_cGameState);
if (tags)
tags->DspLRVals.Broadcast(tfLval, tfRval);

之后,就可以在蓝图中向这个多播代理绑定事件来获得生成的数据了

总结

事件调度器的机制在逻辑实现中非常的方便,尤其是在关卡设计中,可能会比较经常用到。使用中也没有遇到什么特别需要注意的地方,逻辑很单纯。

事件调度器及C++中的使用的更多相关文章

  1. [UE4]Child Widget中的事件调度器

    在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大.

  2. mysql事件调度器定时删除binlog

    MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由Linux操作系统的计划任务来执行的工作MySQL的事件调度器可以精确 ...

  3. MySQL的事件调度器

    自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 ...

  4. MySQL计划任务(事件调度器)(Event Scheduler)

    http://www.cnblogs.com/c840136/articles/2388512.html https://dev.mysql.com/doc/refman/5.7/en/events- ...

  5. MySQL事件调度器event的使用

    Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...

  6. MySQL计划任务(事件调度器)(Event Scheduler)[转]

    原文链接: http://www.cnblogs.com/c840136/articles/2388512.html MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机 ...

  7. MySQL事件调度器Event Scheduler

    我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...

  8. MySQL计划任务(事件调度器)

    原文:http://www.cnblogs.com/c840136/articles/2388512.html 备忘; MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务 ...

  9. mysql 事件调度器

    1.mysql事件调度器,也就是计划任务,计划做某事,有两种方式: 2.在某个时间点做某事,AT TIMESTAMP [+ INTERVAL INTERVAL] 某个时间点加上偏移. 3.定时地做某事 ...

随机推荐

  1. 新东方雅思词汇---6.3、brilli

    新东方雅思词汇---6.3.brilli 一.总结 一句话总结: 发光 brilliant 英 [ˈbrɪlɪənt]  美 ['brɪljənt]  adj. 灿烂的,闪耀的:杰出的:有才气的:精彩 ...

  2. python3.7安装模块MySQLdb报错error: Microsoft Visual C++ 14.0 is required.

    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools&quo ...

  3. JDBC相关总结

    JDBC statement的相关总结 1.Statement.PreparedStatement和CallableStatement都是接口(interface). 2.Statement继承自Wr ...

  4. 命令行连接db2数据库

    在cmd界面执行db2cmd命令 然后在db2cmd界面执行db2命令 然后执行 CONNECT TO UIBS USER DB2INST1 USING 123456命令

  5. ARM汇编指令集4

    协处理器cp15操作指令: mcr & mrc •mrc用于读取CP15中的寄存器 •mcr用于写入CP15中的寄存器   什么是协处理器? •SoC内部另一处理核心,协助主CPU实现某些功能 ...

  6. 【dlbook】数学基础

    [代数] Moore-Penrose 伪逆 [概率信息论] 自信息,香农熵,衡量两个分布的差异:kl散度 \ 交叉熵 [数值] 溢出: softmax计算的时候要关注上溢和下溢,如果所有X都相等且为很 ...

  7. vsftp中的local_umask和anon_umask

    umask是unix操作系统的概念,umask决定目录和文件被创建时得到的初始权限umask = 022 时,新建的目录 权限是755,文件的权限是 644umask = 077 时,新建的目录 权限 ...

  8. 类Flask实现前后端交互之代码聊天室

    前言 框架 项目目录及各自功能 流程图 后端 server backend exector 前端 ajax 页面更新 演示 简易应答模式 代理模式处理外部请求 后台日志 总结 前言 这两天老是做梦,全 ...

  9. Python中实现装饰模式的三种方式

    功能目标 编写一个可以打印被装饰函数名称.执行时间.内存地址得装饰器 前置依赖包 import time import functools from decorator import decorato ...

  10. php小练习——实现几种不同的金字塔

    首先,从简单的着手,打印出金字塔的右半部分,代码如下 <?php $n=5; //金字塔行数 //外层的for循环控制层数 for($i=1;$i<=$n;$i++){ //内层的for循 ...