Unreal Engine 4 C++ Component介绍——BrainComponent

本文详细介绍Unreal Engine 4中BrainComponent的使用方法,包括如何添加依赖、继承及初始化该组件,定义、监听和发送消息的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unreal Engine 4 C++ Component介绍——BrainComponent

好记性不如烂笔头啊,还是记录一下!


BrainComponent简介

BrainComponent是Unreal Engine 4中AI模块中的一个比较重要的组件,游戏中AI的消息收发都可以用到了这个组件。

添加AIModule依赖

PublicDependencyModuleNames.AddRange(
    new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "AIModule"
    }
);

继承BrainComponent

  • MyBrainComponent.h
#pragma once

#include "BrainComponent.h"
#include "UMyBrainComponent.generated.h"
/**
 * 
 */
UCLASS()
class TEST UMyBrainComponent : public UBrainComponent
{
    GENERATED_BODY()


};

由于BrainComponent是一个抽象类,所以使用它需要重新创建个类,来继承他。

  • MyBrainComponent.cpp

#include "UMyBrainComponent.h"

// Set Default Attribute
UMyBrainComponent::UMyBrainComponent(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{

}

使用BrainComponent

然后在需要用到消息收发的AI控制器(AIController)中初始化它。

BrainComponent = CreateDefaultSubobject<UMyBrainComponent>(TEXT("UMyBrainComponent"));

初始化后我们就可以使用它来收发消息了

定义消息

我们可以再创建个头文件来定义消息:

#pragma once

#include "BrainComponent.h"

enum class MyAIState : uint8
{
    None,
    Sleep,
    Work
};

struct FMyAIMsg
{
    GENERATED_USTRUCT_BODY()

public:

    static const FName MyAIStateEnter;
};

监听消息

// 需要监听的h中
#include "BrainComponent.h"

// 类中添加
{
    // AIMessage
    TArray<FAIMessageObserverHandle> AIMessageHandlers;    

    // Test Observer
    void TestAIMessageObserver(UBrainComponent* BrainComp);

    // Handle AI Message
    virtual void HandleAIMessage(UBrainComponent*, const FAIMessage&);
}
// 需要监听的cpp中
void MyTestBrainComponent::TestAIMessageObserver(UBrainComponent* InBrainComp)
{

    FName MessageType = FMyAIMsg::MyAIStateEnter;

    FOnAIMessage Delegate = FOnAIMessage::CreateUObject(this, &MyTestBrainComponent::HandleAIMessage);
    FAIMessageObserverHandle MessageHandler = FAIMessageObserver::Create(InBrainComp, MessageType, FAIRequestID::AnyRequest.GetID(), Delegate);


    AIMessageHandlers.Add(MessageHandler);
}

void MyTestBrainComponent::HandleAIMessage(UBrainComponent* InBrainComp, const FAIMessage& Msg)
{

    FName MsgType = Msg.MessageName;

    if (FMyAIMsg::MyAIStateEnter == MsgType)
    {
        if (GEngine)
        {
            // 显示调试信息五秒。-1“键”值(首个参数)说明我们无需更新或刷新此消息。
            GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("HandleAIMessage"));
        }

        uint8 MsgID = Msg.RequestID.GetID();

        switch (MsgID)
        {
        case MyAIState::Sleep:
            // handle
            break;
        case MyAIState::Work:
            // handle
            break;
        default:
            // handle
            break;
        }
    }
}

这样就完成了消息的监听,下一步我们要发送消息。

发送消息

发送消息就很简单了:

// 需要发送消息的地方

// 组装消息
FAIMessage Msg(FMyAIMsg::MyAIStateEnter, this);
Msg.RequestID = static_cast<uint32>(MyAIState::Work);
FAIMessage::Send(this, Msg);

之后就可以在处理函数HandleAIMessage收到消息并处理消息。(原理大家可以参考BrainComponent的源码。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值