2019年10月11日
UE4中SendAIMessage节点逻辑剖析与应用(二)
前言
上一篇文章,我们剖析了下SendAIMessage(简称SA节点)节点的程序代码流程(传送门)。本文将从应用的角度入手,讲解如何使用接收SA节点发送的消息!
从上一篇文章,我们分析出了一些细节,先将使用细节进行总结
注意事项
- 对象带有UBrainComponent组件(一般UBrainComponent组件我们是挂在到AIController中,AIController用来控制Pawn)才可以发送AIMessage
- 如果希望接收某个对象的SA发送消息,则需要创建FAIMessageObserver对象,然后将回调函数绑定到对象上
- 创建后的 FAIMessageObserver 需要添加到 UBrainComponent 组件中
操作步骤
假定对象A希望接收怪物B的AIMessage消息(谁希望接收都可以,但是发送消息的对象必须要带有 UBrainComponent 组件),步骤如下
在A类中构建回调函数 原型如下
//用来接收蓝图中SA节点发送的消息
void OnReciveAIMessage(class UBrainComponent* BrainComp, const struct FAIMessage& Msg);
在A类中声明绑定句柄对象
注意必须要持有绑定句柄,否则将无法回调成功!(参照源码,绑定返回的句柄是共享指针,不做有效持有,对象将被释放)
FAIMessageObserverHandle ObserverHandle;
在A类中进行绑定
//绑定通知消息
ObserverHandle = FAIMessageObserver::Create(this, TEXT("AIMsg"), FAIRequestID::AnyRequest, FOnAIMessage::CreateUObject(this, &AFoxCharacter::OnReciveAIMessage));
- 在蓝图中SendAIMessage时节点不带ID,所以ID我们填入AnyRequest即可
- Create函数第一次参数传入的是,由哪个对象(必须有 UBrainComponent 组件)进行消息的发送
- FOnAIMessage是声明的单播代理,直接创建绑定即可,我是测试,将消息发送给自己。你可以根据需求选择接收消息的人
在蓝图中尝试调用节点发送消息
- Target:是由谁来发送消息,不是将消息发送给谁,对象需要具有UBrainComponent组件
- Message:既注册的消息标记,上面代码中的“AIMsg”
- MessageSource:允许传递一个U类对象
- Success:标记成功或是失败
我们可以正常的解析绑定函数,当调用蓝图节点时,即可获得消息的通知了!
版本:V4.21.2
About Author
Zack
UEjoy博客发起者,旨在分享更多虚幻引擎技术!如果您有兴趣加入一起维护这个博客,请联系我~邮箱zack#ccvs.cc