[UE4]代理事件(C++)
用宏定义类似格式:
DECLARE_DELEGATE //普通代理
DECLARE_DYNAMIC_DELEGATE_TwoParams //动态代理
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams //动态多广播代理 //多出的两个关键字的作用
In the case of multicast delegates,
any number of entities within your code base can respond to the same event and receive the inputs and use them. In the case of dynamic delegates,
the delegate can be saved/loaded within a Blueprint graph (they're called Events/Event Dispatcher in BP).
DYNAMIC:可以在蓝图里被序列化后定义和绑定操作。
MULTICAST:可实现一个事件类型多函数广播(事件类型必须声明为蓝图类型)
XXXParams:(使用DYNAMIC时)参数个数,宏定义参数里一个参数类型对应一个参数名字。
//声明位置(巩固下C++基础)
如果用到了静态事件类型的变量,因为需要在类外部声明这个变量,所以宏定义代理需要放在类外部。否则,随便放哪都行(在使用之前)。
注意:
1.当使用MULTICAST时,声明的代理事件类型需要声明为蓝图类型。不然报错,如:
//声明代理
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FLoadDesignsDelegateEvent, const TArray<FDesignInfo>&,
_designsInfo, const bool, _result); //声明代理事件类型
static FLoadDesignsDelegateEvent m_OnLoadDesignsEve; //调用代理事件
UFUNCTION(BlueprintCallable, Category = "BZone|SaveGameSystem")
static
void GetOneDesignFromServer(const FString &_userId, const FString& _desingId,const FLoadDesignDelegateEvent& _eve); //报错
F:/UE4_Projects/CGroupSystem_Server/Plugins/SaveGamePlugin/Source/SaveGamePlugin/SaveGame/Public/SaveGameBPLibrary.h()
: Type '{multicast delegate type}' is not supported by blueprint. Function: GetAllDesignsFromServer Parameter _event
2.调用时先检查下是否绑定了代理
RamaMeleeWeapon_OnHit.IsBound()
新版本的:m_DelegateEvent.ExecuteIfBound(params...);
3.UObject和C++的不同绑定
不是MULTICAST:
//UObject
RamaMeleeWeaponComp->RamaMeleeWeapon_OnHit.BindUObject(this,&USomeClass::RespondToMeleeDamageTaken);
//C++
RamaMeleeWeaponComp->RamaMeleeWeapon_OnHit.BindRaw(this,&FSomeRawCPPClass::RespondToMeleeDamageTaken);
是MULTICAST:
TScriptDelegate<> t_de1;
t_de1.BindUFunction(this, STATIC_FUNCTION_FNAME(TEXT("ADrawHouseManager::Mouse_LeftOneClick")));
m_leftOneClickEvents.Add(t_de1);
并且Mouse_LeftOneClickDown();需要UFUNCTION()修饰,否则事件可以添加进代理,但不会进入函数(不在UE的函数列表里所以无法找到并执行)。
封装后的:
TMap<TMulticastScriptDelegate<>*, TScriptDelegate<>> m_bindEvents;
void ADrawHouseManager::AddBindEvent(TMulticastScriptDelegate<>* const _dele, const FString& _functionName)
{
if (_dele!=nullptr&&!_functionName.IsEmpty())
{
TScriptDelegate<> t_de;
FString t_str = "ADrawHouseManager::" + _functionName;
t_de.BindUFunction(this, STATIC_FUNCTION_FNAME(*t_str));
_dele->Add(t_de);
m_bindEvents.Add(_dele, t_de);
}
}
别忘记对象销毁时在析构函数里调用解绑!!!
void ADrawHouseManager::UnBindAllInputEventsFromPC()
{
if (m_bindEvents.Num()>)
{
for (auto it:m_bindEvents)
{
TMulticastScriptDelegate<>* t_dele = it.Key;
if (t_dele!=nullptr)
{
t_dele->Remove(it.Value);
}
}
}
}
ADrawHouseManager::~ADrawHouseManager()
{
UnBindAllInputEventsFromPC();
}
其余细节见:
https://wiki.unrealengine.com/Delegates_In_UE4,_Raw_Cpp_and_BP_Exposed //C++代理事件
https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Delegates/index.html
[UE4]代理事件(C++)的更多相关文章
- 【JS深入学习】——事件代理/事件委托
事件代理/事件委托(event delegation) 需求一:当一个div内部有多个事件发生,给每个元素逐个添加事件十分麻烦... 需求二:在项目中我们常常需要动态的添加元素,不可避免的需要为那些未 ...
- js委托事件和代理事件
转载出处:https://www.cnblogs.com/liugang-vip/p/5616484.html js中的事件委托或是事件代理详解 起因: 1.这是前端面试的经典题型,要去找工作的小伙伴 ...
- 事件代理/事件委托----点击li弹出对应的下标和内容
<body> <ul> <li>这是第一行</li> <li>这是第二行</li> <li>这是第三行</li ...
- AJ学IOS(07)UI之UITextField代理事件_类似QQ登陆窗口的简单实现
AJ分享,必须精品 先看效果图: 学习代码 // // NYViewController.m // 05-UITextField事件_UIKit复习 // // Created by apple on ...
- [UE4]widget事件:On Mouse Enter、On Move Leave、Set Color And Opactiy
只要是widget对象,都具有On Mouse Enter.On Move Leave事件
- [UE4]动画事件
在动画中添加事件通知,在动画蓝图中就可以使用这个事件通知: 在动画蓝图中可以使用“Try Get Pawn Owner”取得控制的角色实例 在Controller中,可以使用“Get Controll ...
- 点击事件与UICollectionView的代理事件的冲突问题
发现的问题:在UIImageView上添加UICollectionView视图,点击UICollectionViewCell,不执行didSelectItemAtIndexPath的代理方法. 解决方 ...
- UE4 代理 BindRaw和BindUObject
代理允许您在C++对象上以通用的但类型安全的方式调用成员函数.通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系. 任何时候都应该通过 ...
- iOS——protoco和delegate (事件代理)
一:被代理人personOne personOne.h #import <Foundation/Foundation.h> @protocol SomeThing<NSObject& ...
随机推荐
- firefox下reset()不好使的问题
最近在测试项目时发现,在firefox下,form.reset()方法对于隐藏的<input>等不起效果,导致程序中出现了错误,以下面为例: js代码: document.agentFor ...
- parser_url
$url="http://127.0.0.1/test2.php?sitename=mysite.cn&a=1&b=2";$a=parse_url($url);p( ...
- OSI七层网络模型与TCP/IP四层模型介绍
目录 OSI七层网络模型与TCP/IP四层模型介绍 1.OSI七层网络模型介绍 2.TCP/IP四层网络模型介绍 3.各层对应的协议 4.OSI七层和TCP/IP四层的区别 5.交换机工作在OSI的哪 ...
- PTA 大炮打蚊子 (15分)
现在,我们用大炮来打蚊子:蚊子分布在一个M×NM\times NM×N格的二维平面上,每只蚊子占据一格.向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O ...
- OC基础:getter和setter,@public @protected @private 分类: ios学习 OC 2015-06-15 19:23 22人阅读 评论(0) 收藏
@public 1.公开的,公共的,可以在类的内部和外部访问. 2.类的内部:实例变量名 3.类的外部:对象->实例变量名 @protected 1.受保护的,只能在本类和子类中可以访问 2.类 ...
- 《流畅的python》读书笔记
流畅的python 第1章 python数据模型 ---1.1 一摞Python风格的纸牌 特殊方法,即__method__,又被称为魔术方法(magic method)或者双下方法(dunder-m ...
- Ubuntu 16.04 LTS安装 cuda8.0
参考文献: http://blog.csdn.net/autocyz/article/details/52299889 http://blog.csdn.net/lixintong1992/artic ...
- Android manifest 获取源代码
/********************************************************************************* * Android manifes ...
- 对比dfs与bfs的存储机制以及bfs与队列的关系
dfs由于是利用递归进行遍历,所以每种情况在时空上不会出现冲突,所以可以利用数组将每种情况的各个元素的值进行存储(即存储当前位) 而bfs由于并不是利用递归,不能将每种情况的值进行不冲突地存储,但由于 ...
- WC游记
第一次来WC,感觉这种集训真吼啊 day0 火车上快速补习了莫队,和AC自动姬,AC自动姬以前就会写只不过太久没写忘了我会了= = 莫队只是学习了做法,还没有做过题…… 本来想再复习一下后缀数组,然后 ...