`
aigo
  • 浏览: 2634818 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

[UE4] C++实现Delegate Event实例(例子、example、sample)

阅读更多

相关文章:

如何用蓝图实现Delegate Event:

http://aigo.iteye.com/blog/2269663

 

原文作者:@玄冬Wong

转载请注明出处: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);

 

Event 和 Delegate 区别

Delegate 只能绑定一个回调函数,Delegate执行Execute()函数时,只会触发事先绑定的一个函数;Event可以绑定任意个函数,一旦执行Event的Broadcast()函数,所有回调函数按Add顺序依次执行。

Dynamic Multicast Delegate也可以同时绑定多个回调函数,但是其运行效率要比 Event 慢。

 

Event 和 Delegate 共同点

回调函数都不能有返回值。

 

Dynamic Delegate 与 常规 Delegate 区别

1,Dynamic Delegates 可以被序列化:即他们的注册函数可以通过名称查找获取,代价是比普通Delegate速度慢。
2,普通Delegate定义参数时,如果使用引用类型,函数执行时传递的实际参数无效,如果要使用引用类型的参数,则要使用Dynamic Delegates。
例如,以TArray的引用类型为例:

DECLARE_DYNAMIC_DELEGATE_OneParam(FMyDelegate, const TArray<FString>& MyArray);

 

分享到:
评论

相关推荐

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    unity delegate和event的例子

    我自己写的一个博文配的例子,博文地址待审核后加上去。

    C++实现delegate

    用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含...但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是很不错的一种方式。

    NET Delegate Event Model vs COM Connection PointsNET事件模型

    首先,让我们理解.NET Delegate Event Model。在.NET Framework中,事件模型基于委托(Delegate)和事件(Event)。委托是类型安全的函数指针,它允许我们将方法作为参数传递给其他方法。事件是对象公开的一种通知...

    delegate和event入门实例

    在.NET框架中,`Delegate`和`Event`是两种关键的多线程编程概念,用于实现事件驱动编程。本文将详细介绍这两个概念,并通过一个在VS2012控制台应用程序中的实例来帮助理解它们的使用。 `Delegate`是.NET中的一个类...

    C++实现C#事件机制

    本文将深入探讨如何在C++中实现C#事件机制的关键元素,并介绍与之相关的函数指针和尾随参数的概念。 首先,让我们了解C#中的事件和委托。在C#中,事件是一种特殊的委托(delegate)类型,用于封装多个方法,这些...

    DelegateEvent04.zip

    在.NET框架中,委托和事件是两种非常重要的编程概念,它们是C#语言中的核心特性,主要用于实现对象间的通信和异步操作。本压缩包"DelegateEvent04.zip"包含了关于C#委托与事件的学习代码,帮助开发者深入理解这两种...

    C# Delegate小例子

    6. **事件(Event)和Delegate**: 在C#中,事件是委托的特殊使用,用于实现发布/订阅模式。类可以声明事件,其他类可以订阅这些事件以接收通知。事件通常通过私有委托类型实现,外部只能通过`add`和`remove`访问器...

    iOS delegate 简单小例子

    iOS 的delegate代码是http://blog.csdn.net/ilikeprograming/article/details/26206075的附件。这份代码有助于新手理解delegate。

    C#中的事件和委托(Delegate,Event)

    在C#编程语言中,事件和委托是两个关键概念,它们是实现对象间通信和响应机制的核心工具。本文将深入探讨这两个概念,并提供详细的解释。 首先,我们要理解什么是委托(Delegate)。委托在C#中是一种类型,它代表了...

    UE4-VS宏提示

    UE4宏提示的实现方式可能包括自定义VS的IntelliSense配置,或者使用第三方插件,这些插件通常会解析UE4的头文件,生成更详细的元数据,用于增强VS的代码提示。这些提示可能包含宏的详细说明、参数信息以及示例用法,...

    C++下实现委托的代码

    在C++编程中,"委托"(Delegate)的概念源自于其他一些编程语言,如C#或Java,但在C++标准库中并没有内置的委托机制。然而,通过一些编程技巧,我们可以模拟实现类似的功能。委托通常用于传递函数或者方法作为参数,...

    简单的delegate实现

    5. **设置Delegate实例**: 最后,在需要响应事件的类(如ViewController)中,我们设置CustomButton的Delegate为自身,并实现协议中的方法: ```objc - (void)viewDidLoad { [super viewDidLoad]; ...

    qt model view Delegate的例子

    这个例子中的“qt model view Delegate”可能是为了演示如何有效地使用这些组件来实现复杂的用户界面功能。 在Qt中,模型(Model)存储和管理数据,可以是简单的列表或表格,也可以是复杂的数据结构。视图(View)...

    Delegate.Event.ThreadDelegate.Event.Thread

    【Delegate.Event.ThreadDelegate.Event.Thread】这个标题看起来像是一个编程相关的概念,主要涉及到的是委托(Delegate)、事件(Event)以及线程(Thread)。在.NET框架中,委托是引用方法的类型,可以用来传递...

    事件触发最简单例子event delegate

    事件触发是事件驱动编程的核心,而委托(Delegate)则是实现事件处理的关键机制。本文将深入探讨事件触发与委托的概念,并通过一个简单的例子来演示它们的工作原理。 首先,让我们理解什么是事件。事件是一种封装了...

    C#调用C++动态库的例子工程

    本示例工程“C#调用C++动态库的例子”展示了如何在C#中通过委托实现这种跨语言互操作性。 首先,让我们理解委托在C#中的概念。委托是类型安全的事件处理程序,可以引用具有相同签名的方法。它们类似于C++中的函数...

    c++实现委托和事件

    在C++编程中,模拟C#中的委托和事件机制是一项挑战,因为C++标准库并不直接支持这样的概念。然而,通过使用`std::function`和`std::bind`,我们可以实现类似的功能。以下是对这两个关键工具的详细解释,以及如何用...

    Delegate Event Study

    在上面的例子中,`MyDelegate`是定义的一个委托类型,`DisplayMessage`是接受委托的方法,`myDelegate`是委托实例,它存储了`DisplayMessage`方法的引用。 接下来,我们来看事件。事件是.NET中的一种特殊类型的委托...

    ios socket delegate sqlite 实例

    在iOS开发中,结合Socket...综上所述,"ios socket delegate sqlite实例"是一个综合性的iOS开发主题,涵盖了网络通信、事件驱动编程、本地数据持久化等多个关键领域,对于提升iOS应用的功能性和用户体验具有重要意义。

Global site tag (gtag.js) - Google Analytics