UE4 AIController之AIPerception(感知)组件

本文深入探讨了UE4中的AIPerception模块,详细解释了包括伤害、听觉、预测、团队合作、视觉和触碰在内的六种感知类型。通过在行为树中使用Bool值进行实时更新信息的判断,实现对感知目标的精准识别。

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

AIPerception(感知)
在这里插入图片描述
这里UE4自身已经做好了一个分类
1、伤害的感知;2、听觉的感知;3、预测的感知;4、团队合作的感知;5、是否看得见的感知;6、触碰的感知;
在这里插入图片描述

这里是我是做了一个看见看不见的检测,在行为树的黑板中添加一个Bool值来判定感知Actor的实时更新信息,如果确实更新信息了,就在黑板想要发生的行为中再判定一下是否看的见,如果看的见就执行,如果看不见就说明也不做!

<think>好的,我现在需要帮用户解决在UE5中用C++实现AI敌人,让敌人通过声音和视觉范围来找到玩家的问题。首先,我得先理解用户的需求。用户可能是一个刚开始学习UE5的开发者,想要创建一个基础的AI敌人系统,但不太清楚具体的实现步骤。用户之前的问题是关于蓝图中的瞄准速度控件没效果,现在转向C++实现AI,可能是在尝试更复杂的系统,或者觉得蓝图不够灵活,需要更底层的控制。 接下来,我需要考虑用户可能对C++和UE5的AI系统了解程度。用户可能已经了解一些蓝图的知识,但C++方面可能还不太熟悉。因此,我需要从基础开始解释,确保步骤清晰,并提供足够的代码示例,同时指出关键点。 首先,UE5中的AI通常涉及行为树、黑板、AI控制器和感知系统。用户提到声音和视觉范围,这需要使用AI感知组件,比如AIPerceptionComponent,特别是视觉和听觉感知UE5中的AIPerception系统可以处理这些需求,包括配置Sight和Hearing配置。 接下来,我需要分步骤讲解如何实现。首先是创建必要的C++类,包括敌人角色、AI控制器和可能的行为树。然后,设置感知系统,配置视觉和听觉的参数,比如视距、视角、听力范围等。接着,处理感知事件的回调函数,当AI检测到玩家时更新黑板数据,触发行为树的任务,比如移动到玩家位置。 同时,用户可能需要了解如何在C++中编写行为树的任务,比如BTTask_FindPlayer,用于寻找玩家位置并移动到那里。此外,还需要处理感知到的刺激,比如当玩家进入视线或发出声音时,AI如何反应。这可能涉及到将感知到的Actor转换为玩家角色,并更新黑板中的目标键。 需要注意的常见问题包括:是否正确设置AIController感知组件是否配置正确,黑板键是否正确命名和类型匹配,行为树的逻辑是否正确,以及网络同步问题(如果是多人游戏)。此外,调试方法也很重要,比如显示调试信息、打印日志等,帮助用户验证AI是否正常工作。 用户可能遇到的问题包括AI没有反应,可能是因为感知配置的范围太小,或者回调函数没有正确绑定,黑板键没有正确设置,行为树没有运行等。需要提醒用户检查这些部分,并提供测试建议,比如在回调函数中打印日志,查看感知是否触发。 最后,总结关键步骤,确保用户能够按照步骤逐步实现,并提供示例代码和配置说明,帮助用户理解每个部分的作用。同时,强调编译和保存的重要性,避免低级错误。</think>在Unreal Engine 5中通过C++实现AI敌人,需要结合**行为树(Behavior Tree)**、**黑板(Blackboard)**和**AI感知系统(AIPerception)**。以下是分步骤实现方案: --- ### **1. 创建基础C++类** #### (1) 创建敌人角色类 ```cpp // Header: EnemyCharacter.h #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "EnemyCharacter.generated.h" UCLASS() class YOURPROJECT_API AEnemyCharacter : public ACharacter { GENERATED_BODY() public: AEnemyCharacter(); // 必须添加感知组件 class UAIPerceptionComponent* AIPerception; }; ``` #### (2) 创建AI控制器类 ```cpp // Header: EnemyAIController.h #include "AIController.h" #include "EnemyAIController.generated.h" UCLASS() class YOURPROJECT_API AEnemyAIController : public AAIController { GENERATED_BODY() public: virtual void OnPossess(APawn* InPawn) override; // 黑板键名称定义 UPROPERTY(EditDefaultsOnly) FName TargetKey = "TargetActor"; }; ``` --- ### **2. 配置感知系统** #### (1) 在敌人角色构造函数中初始化感知 ```cpp // Source: EnemyCharacter.cpp #include "Perception/AIPerceptionComponent.h" #include "Perception/AISenseConfig_Sight.h" #include "Perception/AISenseConfig_Hearing.h" AEnemyCharacter::AEnemyCharacter() { // 创建感知组件 AIPerception = CreateDefaultSubobject<UAIPerceptionComponent>(TEXT("AIPerception")); // 配置视觉感知 UAISenseConfig_Sight* SightConfig = CreateDefaultSubobject<UAISenseConfig_Sight>(TEXT("SightConfig")); SightConfig->SightRadius = 2000.f; // 视距 SightConfig->LoseSightRadius = 2200.f; SightConfig->PeripheralVisionAngleDegrees = 60.f; // 视角范围 SightConfig->DetectionByAffiliation.bDetectEnemies = true; // 配置听觉感知 UAISenseConfig_Hearing* HearingConfig = CreateDefaultSubobject<UAISenseConfig_Hearing>(TEXT("HearingConfig")); HearingConfig->HearingRange = 1500.f; // 听力范围 HearingConfig->LoSHearingRange = 1000.f; // 绑定感知组件 AIPerception->ConfigureSense(*SightConfig); AIPerception->ConfigureSense(*HearingConfig); AIPerception->SetDominantSense(SightConfig->GetSenseImplementation()); } ``` #### (2) 在AI控制器中处理感知事件 ```cpp // Source: EnemyAIController.cpp #include "BehaviorTree/BlackboardComponent.h" #include "Perception/AIPerceptionComponent.h" void AEnemyAIController::OnPossess(APawn* InPawn) { Super::OnPossess(InPawn); if (BehaviorTree) { RunBehaviorTree(BehaviorTree); } // 绑定感知回调 UAIPerceptionComponent* Perception = Cast<UAIPerceptionComponent>(GetPawn()->FindComponentByClass<UAIPerceptionComponent>()); if (Perception) { Perception->OnPerceptionUpdated.AddDynamic(this, &AEnemyAIController::OnPerceptionUpdated); } } void AEnemyAIController::OnPerceptionUpdated(const TArray<AActor*>& UpdatedActors) { for (AActor* Actor : UpdatedActors) { if (Actor->IsA(APlayerCharacter::StaticClass())) // 替换为你的玩家类 { GetBlackboardComponent()->SetValueAsObject(TargetKey, Actor); break; } } } ``` --- ### **3. 行为树配置** #### (1) 创建行为树任务 ```cpp // Header: BTTask_FindPlayer.h #include "BehaviorTree/Tasks/BTTask_BlackboardBase.h" #include "BTTask_FindPlayer.generated.h" UCLASS() class YOURPROJECT_API UBTTask_FindPlayer : public UBTTask_BlackboardBase { GENERATED_BODY() virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; }; ``` ```cpp // Source: BTTask_FindPlayer.cpp #include "Kismet/GameplayStatics.h" EBTNodeResult::Type UBTTask_FindPlayer::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { if (AAIController* AIController = OwnerComp.GetAIOwner()) { if (APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0)) { AIController->MoveToActor(PlayerPawn, 50.f); // 保持50cm距离 return EBTNodeResult::Succeeded; } } return EBTNodeResult::Failed; } ``` --- ### **4. 最终配置步骤** 1. **蓝图配置**: - 在UE编辑器中为敌人角色设置`AIController Class`为你的`EnemyAIController` - 创建行为树资产并关联到控制器 - 在黑板中定义`TargetActor`键(类型:Object) 2. **调试工具**: - 按`` ` ``键打开控制台输入`ai.DebugBehaviorTree 1`显示行为树运行状态 - 使用`ShowDebug AI`可视化感知范围 --- ### **常见问题排查** 1. **AI无反应**: - 检查行为树是否关联到控制器 - 确认`AIPerceptionComponent`被正确初始化 - 验证玩家角色是否设置了正确的`Team ID` 2. **感知不触发**: - 在玩家角色中调用`MakeNoise(1.0f)`生成声音 - 确保玩家在敌人感知配置的范围内 3. **移动失败**: - 检查导航网格体(NavMesh)是否覆盖场景 - 确认`MoveToActor`的参数有效 --- 通过以上步骤,可以实现基于C++的AI敌人系统,结合视觉和听觉感知实现智能索敌。如果需要更复杂的行为(如巡逻、攻击),可在行为树中添加相应任务节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值