转自: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. Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率

    注意:由于是重复数据,词法不具有通用性!文章价值不大! 摘自:https://segmentfault.com/a/1190000002695169 Doc Values 会压缩存储重复的内容. 给定 ...

  2. .NET中 数据库连接

    (转自:http://www.iwms.net/n459c12.aspx) SQL Server ODBC  Standard Security:"Driver={SQL Server};S ...

  3. 用Spring和c3p0工具简单的实现增删改查

    1.导入Spring和c3p0的jar包 2.配置beans.xml文件 <?xml version="1.0" encoding="UTF-8"?> ...

  4. 条款19:定义class就相当于定义一个个的内置类型

    下面的条框应该是谨记的: 1. 新的type应该如何创建与销毁 2. 对象的初始化与赋值应该有什么样的区别 3. 新type的对象如果被pass-by-value,有什么影响? 4. 什么事新type ...

  5. AutoLayout 使用详细

    1.实际应用中,这Compact,Any,Regular如何运用呢? w:Any h:Any 是我们刚建立工程时候默认选择的,算是一切描述的父类.其他的种类描述都是在此基础上变化的,比如:如果weig ...

  6. Python编码错误的解决办法SyntaxError: Non-ASCII character '\xe5' in file

    [现象] 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* [原因 ...

  7. 2017.11.2 Talk to customers for an hour

    yesterday::: Hi Huang, For the better performance of the test the Con 6 should be connected all the ...

  8. New Concept English three (36)

    21 54 We are less credulous than we used to be. In the nineteenth century, a novelist would bring hi ...

  9. git合并分支与解决冲突

    前提: 当前开发的分支为feature/20161129_317606_algoplatform_1,由于feature/20161130_322574_tmstools_1分支有新内容,所以准备将f ...

  10. 你必须知道的495个C语言问题,学习体会四

    本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限 ...