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

添加评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注