我在设置AI感知追踪的时候发现个问题,当场景出现两个AI时,它们发现对方后会互相触发追踪,那我想让它对发现的Actor做一个区分,就需要用到这个功能。
虚幻官方文档:该属性可用于设置团队视觉感知。目前, 归属关系(Affiliation) 只能在C++中定义。对蓝图而言,您可以使用 检测中立方(Detect Neutrals) 选项来检测所有Actor,然后使用 标签(Tags) 过滤Actor的类型。
首先第一步工作就是在编译器中创建一个头文件来放置TeamAffiliation的枚举
//TeamType.h
#pragma once
UENUM(BlueprintType)
enum class ETeamAffiliation : uint8
{
FRIENDLY,
ENEMY,
NEUTRAL
};
提示:创建头文件时记得确认路径是否与项目文件一致(默认它不会跟代码文件在一个位置)
在玩家和AI类中定义
//玩家类
#include "TeamType.h"
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Affiliation", meta = (AllowPrivateAccess = "true"))
ETeamAffiliation Affiliation = ETeamAffiliation::FRIENDLY;//设定为友方
//AI类
#include "TeamType.h"
#include "对应的AI控制器"
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Affiliation", meta = (AllowPrivateAccess = "true"))
ETeamAffiliation Affiliation = ETeamAffiliation::ENEMY;//设定为敌方
//AI的视觉函数
UFUNCTION()
void OnTargetPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus);
//AI类.cpp
beginplay中调用:
EnemyAIController->PerceptionComponent->OnTargetPerceptionUpdated.AddDynamic(this, &AWalkEnemyCharacter::OnTargetPerceptionUpdated);
//视觉函数设定
void AWalkEnemyCharacter::OnTargetPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus)
{
if (!Actor)
{
return;
}
if (Stimulus.IsActive())//当发现Acotr时
{
//判定是否是玩家角色
AHeroCharacter* Hero = Cast<AHeroCharacter>(Actor);
//如果所属阵营不一致则开始追踪
if (Hero && Hero->Affiliation != this->Affiliation)
{
UE_LOG(LogTemp, Warning, TEXT("ContorllerFind Player"));
EnemyAIController->GetBlackboardComponent()
->SetValueAsObject(TEXT("Target"), HeroCharacter);
EnemyAIController->GetBlackboardComponent()
->SetValueAsBool(TEXT("FindPlayer"), true);
}
}
else
{
UE_LOG(LogTemp, Warning, TEXT("NOFind Player"));
EnemyAIController->GetBlackboardComponent()->SetValueAsObject(TEXT("Target"), nullptr);
EnemyAIController->GetBlackboardComponent()->SetValueAsBool(TEXT("FindPlayer"), false);
}
}
设置完成后AI应该就不会互相追踪了。