事件调度器及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);

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

总结

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

时间: 2024-11-06 07:14:57

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

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

在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大. 原文地址:https://www.cnblogs.com/timy/p/9147633.html

MySQL创建事件调度器

MySQL中的事件调度器,可以用来执行定时任务. 一.开启 事件调度默认是关闭的,开启可执行. 查看事件调度器是否开启:     SHOW VARIABLES LIKE 'event_scheduler';   SELECT @@event_scheduler; 开启事件调度器 SET GLOBAL event_scheduler=1; SET GLOBAL event_scheduler=ON; 或者在my.ini文件中加上event_scheduler=1 或者在启动命令后加上"-event

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

原文链接: http://www.cnblogs.com/c840136/articles/2388512.html MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机制,在指定的时间单元内执行特定的任务,因此今后一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能. 要查看当前是否已开启事件调度器,可执行如下SQL: SHOW VARIABLES LIKE 'event_scheduler'; 或 SELECT @@event_scheduler

MySQL 事件调度器

MySQL中的事件调度器是 MySQL 5.1 以后才新增的功能.可以将数据库按照规定的时间周期对数据库做,增加,删除,修改等操作.相当于linux中的无人调度器 crontab(相关crontab的操作请看参看我些的linux的计划任务).避免了一些数据相关的定时任务在业务操作层,减少操作员误操作的风险, 大大缩短了工作量提高工作效率. 首先介绍下语法: CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPL

MySQL事件调度器Event Scheduler

我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在mysql5.1及其之后的版本号添加了计划任务的功能(mysql事件调度器Event Scheduler). 事件调度器是定时触发运行的.在这个角度上也能够称作是"暂时的触发器". 触发器仅仅是针对某个表产生的事件运行一些语句.而事件调度器则是在某一个(间 隔)时间运行一些语句.事件是由一个

MySQL事件调度器event的使用

Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? A: 在Linux里面可以使用at.crontab来实现上面的需求:MySQL里面也有这样的方法,就是event对象. 也被称为MySQL事件调度器(Event Scheduler),可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN ... END):或者每隔固定间隔重复执行.类似于Li

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

原文:http://www.cnblogs.com/c840136/articles/2388512.html 备忘; MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机制,在指定的时间单元内执行特定的任务,因此今后一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能. 要查看当前是否已开启事件调度器,可执行如下SQL: SHOW VARIABLES LIKE 'event_scheduler';或 SELECT @@event_scheduler

MySQL的事件调度器使用介绍

MySQL的事件调度器使用介绍 自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 SET GLOBAL event_scheduler=1; SET GLOBAL event_scheduler=ON; 或者在my.ini文件中加上event_scheduler=1 或者在启动命令后加上"-event_scheduler=1" 可以通过

python标准库之sched 定时事件调度器

# -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#py标准库之schedimport timeimport sched#定时事件调度器#使用time来掌握当前时间,还有一个是延迟(delay)来指定一个时间段#调用time是不带任何参数的,返回当前一个时间数,delay要提供一个整数的参数,#有延迟运行事件"""4个方法1:表示延迟的数:2:优先级值:3:要调用的函数;4:函数参数的元组""