事件调度器及C++中的使用
转自: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++中的使用的更多相关文章
- [UE4]Child Widget中的事件调度器
在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大.
- mysql事件调度器定时删除binlog
MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由Linux操作系统的计划任务来执行的工作MySQL的事件调度器可以精确 ...
- MySQL的事件调度器
自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 ...
- MySQL计划任务(事件调度器)(Event Scheduler)
http://www.cnblogs.com/c840136/articles/2388512.html https://dev.mysql.com/doc/refman/5.7/en/events- ...
- MySQL事件调度器event的使用
Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...
- MySQL计划任务(事件调度器)(Event Scheduler)[转]
原文链接: http://www.cnblogs.com/c840136/articles/2388512.html MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机 ...
- MySQL事件调度器Event Scheduler
我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...
- MySQL计划任务(事件调度器)
原文:http://www.cnblogs.com/c840136/articles/2388512.html 备忘; MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务 ...
- mysql 事件调度器
1.mysql事件调度器,也就是计划任务,计划做某事,有两种方式: 2.在某个时间点做某事,AT TIMESTAMP [+ INTERVAL INTERVAL] 某个时间点加上偏移. 3.定时地做某事 ...
随机推荐
- BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay
传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...
- python爬虫scrapy框架——爬取伯乐在线网站文章
一.前言 1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...
- 自行实现Kinect 手势Demo踩的坑
要将继承KinectGestures.GestureListenerInterface的脚本手动赋值给KinectManager脚本的手势监听列表
- python 实现简单点名程序
程序会遍历文件所有姓名,遍历完之前不会有重复值,遍历所有后将提示推出. #-*-coding:utf-8-*-#author:wangxing #点名程序 import randomimport os ...
- xml、json的序列化与反序列化
xml数据 : XmlSerializer.Serialize 与 XmlSerializer.Deserialize,使用起来稍有些复杂,需要对 “实体模型” 的“对应属性” 进行 节点特 ...
- python基础之迭代器协议和生成器(二)
一.什么是迭代器: 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器是一个可以记住遍历的位置的对象. 迭代器的 ...
- C++轮子队-软件需求规格说明书
团队Github项目仓库 软件规格需求说明书 引言 编写目的 软件规格需求说明书书了“2048俄罗斯方块”1.0版本的软件功能性需求和非功能性需求. 文档约定 描述编写文档时所采用的标准或排版约定,包 ...
- margin特性深入分析与总结
今天写了个小demo,总体不难,但一些细节需要注意: 1)如下图所示,蓝色区域为白色box的padding,橙色区域为每条数据项的margin-bottom,那么如何解决最后一条记录margin-bo ...
- Event 同步机制
In computer science, an event (also called event semaphore) is a type of synchronization mechanism t ...
- Intellij IDEA带参数启动Springboot注意事项
问题 不同版本的spring-boot-maven-plugin的jvm参数配置有所不同,同时与通过main方法启动springboot程序传递参数也有所不同. 分析 在运行main方法时,可以通过j ...