UE4/5C++:Delegate(委托or代理?)的使用

这篇具有很好参考价值的文章主要介绍了UE4/5C++:Delegate(委托or代理?)的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

DECLARE的使用

单播:

绑定UObject

绑定

调用

无参调用

解除绑定:

绑定Lambda表达式:

绑定c++原生的c++类的函数:

绑定共享指针:

绑定静态函数:

绑定线程安全的共享指针:

绑定一个Function方法:

多播

动态单播代理:

 用在蓝图上:

在c++中如何绑定:

 动态多播代理

 用在蓝图上:

​编辑

c++内绑定:


Delegate有的人说是委托,有的人说是代理。
虚幻引擎中的Delegate通常被翻译为“委托”,但它实际上更接近于C#中的“代理”。在虚幻引擎中,Delegate是一种允许多个函数指针被存储和调用的类型。

虚幻引擎中的Delegate可以分为多播代理(Multicast Delegate)和单播代理(Unicast Delegate)两种类型。

单播代理只能存储一个函数指针,当Delegate被调用时,只会调用该指针所指向的函数。

多播代理则可以存储多个函数指针,当Delegate被调用时,会调用存储的每个函数指针。多播代理还可以使用加法运算符(+=)和减法运算符(-=)来添加或移除函数指针。

【但是多播代理绑定的函数执行是不固定的】

值得注意的是多播代理是没有返回值的。

因此,区别在于单播代理只能存储一个函数指针,而多播代理可以存储多个,并且可以进行添加或移除操作。多播代理常用于实现事件和回调函数的多个注册和注销,而单播代理则常用于只需要单个函数指针的情况。

DECLARE的使用

第一步我们先创建一个简单的Actor类,在有了头文件和cpp文件之后,我们就可以在里面输入这些宏了:

首先是

单播:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

绑定UObject

绑定自UObject类的类里面的成员函数

绑定

如图所示 :这就是一个简单的单播代理,单播只能绑定一个委托函数,所绑定的委托函数可以有返回值,也可以没有返回值。 静态委托执行前最好检查是否绑定,否则会导致程序崩溃,如果重复进行绑定,会覆盖上一次的绑定

基本上都是一样的格式,如果有返回值的,则需要将返回值写在最前面:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

 看一下cpp文件是如何实现绑定的:

首先是对函数testBind的实现,然后是在beginplay中绑定

绑定时候的参数填写:

	//第一个参数是绑定的方法是哪个类的,因为是在自身所以写this
	//第二个参数就是要绑定的函数,要使用&(引用符号),因为这里传入的是函数指针
	DelegateRetValOneparam.BindUObject(this, &AMyActor::testBind);

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

这样子就绑定好了,那么该如何调用呢?

调用

在要调用的地方输入下面这个即可 ,比如我在beginplay中这样调用:

if (DelegateRetValOneparam.IsBound())//判断是否绑定
	{
        //输入的是float:10.5【因为这里我绑定的函数要输入值】
		DelegateRetValOneparam.Execute(10.5);
	}

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

如果学会了上面的操作,那么其他的其实都是一模一样的方法。

无参调用

好了,这样子就调用完毕了,当然如果是无参数的,那么只需要这样即可:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

 这里作者并没有进行绑定,但是可以看到ExecuteIfBound(),这个的意思就是上面的如果你绑定了就执行结合了起来(不过这个不能有输入和返回值)。

解除绑定:

在最后写个这个即可。

DelegateRetValOneparam.Unbind();

绑定Lambda表达式:

之前我们讲了正常的绑定,接下来就要讲解对Lambda表达式的绑定:

想必学过lambda表达式的懂的都懂(多的就不讲了):

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

这样子就做好了一个简单的对lambda表达式的绑定了

绑定c++原生的c++类的函数:

就是说自己做了一个c++类,而不是继承虚幻引擎的类,然后绑定里面的函数:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

class FTest
{
public:
	int32 testA(float a)
	{
		return 0;
	}
};
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
	Super::BeginPlay();

	FTest pTest;
	DelegateRetValOneparam.BindRaw(&pTest, &FTest::testA);

	if (DelegateRetValOneparam.IsBound())
	{
		DelegateRetValOneparam.Execute(10.5);
	}
	//DelegateNo.ExecuteIfBound();
}

绑定共享指针:

 方法都差不多:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

绑定静态函数:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

如过是在某个类里面的静态函数,和之前的一样,是这样的-> &类的名字::函数名字

绑定线程安全的共享指针:

和绑定共享指针差不多,只不过要做一个更改:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

绑定一个Function方法:

里面涉及到了反射,所以在头文件里面,对要绑定的函数,需要做一个UFUNCTION。

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

多播

多播代理是没有返回值的

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

//多播代理
DECLARE_MULTICAST_DELEGATE(FTestMulticastDelegateNoparma);
DECLARE_MULTICAST_DELEGATE_OneParam(FTestMulticastDelegateOneparma,float);

和单播代理的一样,放在头文件的类里面

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

然后在cpp中实现:

值得一提的是我们需要将函数做一个没有返回值的函数,不然是无法添加的:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

绑定和调用就如此简单。

	//多播绑定
	MulticastDelegateOneparma.AddUObject(this, &AMyActor::testBind);
	//调用
	MulticastDelegateOneparma.Broadcast(5.2);

动态单播代理:

 用在蓝图上:

动态单播代理 必须以F开头,否则报错

一定要加UFUNCTION,因为他是要在蓝图中暴露的,否则报错

它和上面差不多,好处是可以暴露到蓝图中去使用:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

//动态单播代理 必须以F开头,否则报错 相对较慢,耗性能
DECLARE_DYNAMIC_DELEGATE(FTestDynamicDelegate);
//动态代理的参数需要取参数名 因为他们在蓝图中使用需要名字
DECLARE_DYNAMIC_DELEGATE_OneParam(FTestDynamicDelegateOneparam,float,a);
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(int32,FTestDynamicDelegateRetValOneparam,float,a);

 在头文件中这样写:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

//动态单播代理,这样就可以暴露到蓝图中去使用
	UFUNCTION(BlueprintCallable)
	void testDYOne(FTestDynamicDelegateRetValOneparam DYDRVOneParam);

 然后我们可以去蓝图中看看是什么情况:这是在蓝图中绑定

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

在c++中如何绑定:

和之前的绑定方法是一样的 

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

 动态多播代理

 用在蓝图上:

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言

c++内绑定:

 ue4 蓝图委托,# ue4/5c++,# ue4/5蓝图混合c++,ue4,c++,ue5,开发语言文章来源地址https://www.toymoban.com/news/detail-725805.html

到了这里,关于UE4/5C++:Delegate(委托or代理?)的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4C++之动态多播委托的简单使用

    本文讲述一下动态多播委托的简单使用,包括它的声明,定义,在蓝图中的使用。 我这边使用的前提是在创建了一个属性组件,添加到角色中,当角色收到血量改变的通知的时候,会进行相应的处理。 定义变量,注意在public权限内使用,因为外部会引用到。BlueprintAssignable标

    2024年02月13日
    浏览(29)
  • UE4/5C++之SubSystem的了解与创建

    目录 了解生命周期 为什么用他,简单讲解? SubSystems创建和使用 创建SubSystems中的UGamelnstanceSubsystem类: 写基本的3个函数: 在蓝图中的样子: 创建SubSystems中的UEditorSubsystem类: SubSystem是什么就不多说了,可以看看大钊的相关文章: 《InsideUE4》GamePlay架构(十一)Subsystems - 知

    2024年02月14日
    浏览(29)
  • UE4/5C++多线程插件制作(十四、MTPAbandonable)

    目录 MTPAbandonable  h实现 cpp实现 MTPMarco.h 首先是异步任务的宏定义部分:

    2024年02月15日
    浏览(38)
  • UE4 添加按键输入事件 并在蓝图中使用按键输入节点

    选择Edit/ProjectSettings/Engine/Input 在bindings中可以选择添加ActionMappings或则AxisMappings ActionMappings:按键事件,有按下和抬起两个事件,需要分别用两个键触发 AxisMappings:输入事件,返回值为float,对于键盘,值为0和1 ,对于摇杆为0-1 新建一个事件 : 点击ActionMappings或AxisMappings后的

    2024年01月20日
    浏览(31)
  • UE4 使用控件蓝图的动画功能实现UI的淡入淡出

    效果: 步骤: 首先PS一张背景纯黑,边缘有羽化效果的图片: 新建一个控件蓝图,创建一个图像和按钮控件,控件的初始位置如下所示,设置图像一开始为完全透明 新建两个动画,分别命名为“向左移动”和“向右移动” 在时间轴上添加对按钮和图像的控制 按钮主要是对

    2024年02月17日
    浏览(31)
  • UE4\UE5 蓝图节点Delay与Retriggerable Delay的使用与区别

    常用的节点之:Delay、Retriggerable Delay    这两个节点的用法相当于SetTimeOut方法,延迟多少秒执行操作,唯一的区别就是: Delay:指定一个延时的时间进行一次操作,倒计时过程中再次调用无效(时间不会被重置) Retriggerable Delay:可重新触发延时时间进行一次操作,倒计时过

    2024年02月13日
    浏览(37)
  • 【UE4】物理引擎(蓝图)

    物理引擎通过为刚性物体赋予真实的物理属性的方式来计算 运动、旋转和碰撞反映。 游戏引擎中的物理引擎的主要目的是为了解决物体在空间的状态信息。 常规的物理引擎遵循物理定律,按照给定的算法,进行模拟物理运动。所以在没有多元因素影响的情况下,物理引擎的

    2023年04月11日
    浏览(49)
  • 【UE4】TimeLine(蓝图)

    虚幻中的数据时间轴计数器,作用是将时间和数据进行组合,使得数据随着时间的改变发生变化。 可以将TimeLine理解为一个直角坐标系,横轴为时间,纵轴为数据。 输入针脚: Play :启动此时间轴 Play from Start :从开始的时候启动此时间轴 Stop :结束 Reverse :反方向走时间轴

    2023年04月24日
    浏览(37)
  • UE4 控件蓝图与蓝图的交互

    我现在想实现的是点击场景中的一个蓝图中的某个静态网格体,然后在控件蓝图中的文本控件中就能显示这个被点击的静态网格体的名称。 首先我在控件蓝图中对其中的一个文本控件创建了一个绑定函数 绑定函数的逻辑如下: “整车 内部无系统”是我添加的一个变量,该变

    2024年02月11日
    浏览(29)
  • UE4 蓝图通信:接口调用

    UE4学习心得:蓝图间信息通信的几种方法 UE4的接口调用技术有点简单粗暴,而且主要体现在主蓝图对子蓝图的信息通信。 在内容浏览器中添加一个蓝图接口,命名为TestInterface  双击打开接口,直接使用其创建时自带的一个接口函数,将其重命名为TestAddOffset (这里相当于接

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包