一、
AIPerception 是刺激源的接收器 你需要在aicontroller上添加 然后你才能听到别人发出的声音 或者看见别人,也可以添加到character上 不过添加到character后,ai内部的一个队伍信息就不好用了 所以尽量添加到Controller中
AIPerceptionStimuliSource 是刺激源的发生器 你需要在自己身上上添加该项 并注册 才能让别人通过AIPerception发现,不过所有的pawn都会默认添加上 Sight视线,所以如果你需要添加其他类型的刺激或者是让普通的actor也可以被识别,你才需要使用AIPerceptionStimuliSource
二、
队伍ID逻辑: 默认为ETeamAttitude::Neutral属性 即路人属性,这时候就需要在AIPerception的sense中配置上DetectNeutrals
可以通过重载IGenericTeamAgentInterface 接口的GetGenericTeamId 来返回你的id值 逻辑判断中 相同id是Friendly 不同id为Hostile
virtual FGenericTeamId GetGenericTeamId() const override { return FGenericTeamId(254); } //这里修改id值为254
假如想修改判断逻辑的话,可以通过下面的方式进行修改
namespace
{
ETeamAttitude::Type DefaultTeamAttitudeSolver(FGenericTeamId A, FGenericTeamId B)
{
return A != B ? ETeamAttitude::Hostile : ETeamAttitude::Friendly;
}
}
FGenericTeamId::FAttitudeSolverFunction FGenericTeamId::AttitudeSolverImpl = &DefaultTeamAttitudeSolver;
Ps:还有一个情况不知道是不是我看的有问题 就是假如A想检测B的team id情况 那么实际上是使用A Controller的GetGenericTeamId()和B 本身也就是Pawn的GetGenericTeamId()进行比较,所以就是建议Controller和Pawn都实现GetGenericTeamId()函数,
三、
代码中配置AIPerception
添加Component 在Controller的构造函数中 SetPerceptionComponent(*CreateDefaultSubobject<UAIPerceptionComponent>(TEXT("AIPerception")));
配置Component中的Config 这里有一些区别 一种是在构造函数中添加Config
SightConfig = NewObject<UAISenseConfig_Sight>(this, TEXT("Sight Config"));
//SightConfig = CreateDefaultSubobject<UAISenseConfig_Sight>(TEXT("Sight Config"));//创建sight型Config
SightConfig->DetectionByAffiliation.bDetectEnemies = true; //依靠前面的敌我逻辑 设置检测类型
SightConfig->DetectionByAffiliation.bDetectFriendlies = true;
SightConfig->DetectionByAffiliation.bDetectNeutrals = true;
SightConfig->SightRadius = 500; //进入该范围 会触发进入事件
SightConfig->LoseSightRadius = 500 + 100; //离开该范围 会触发离开事件
SightConfig->SetMaxAge(5.0f);
SightConfig->PeripheralVisionAngleDegrees = 120 / 2;
GetPerceptionComponent()->SetDominantSense(SightConfig->GetSenseImplementation());
GetPerceptionComponent()->ConfigureSense(*SightConfig);
GetPerceptionComponent()->OnTargetPerceptionUpdated.AddDynamic(this, &AEnemyAIControllerBase::OnPerceptionUpdate); //绑定事件回调
另外一种就是假如你想在合适的时间 另外进行配置的话 需要在上面的基础上添加下面代码
UAIPerceptionSystem* AIPerceptionSys = UAIPerceptionSystem::GetCurrent(GetWorld());
AIPerceptionSys->RegisterSenseClass(SightConfig->GetSenseImplementation());
const FAISenseID SenseID = UAISense::GetSenseID(SightConfig->GetSenseImplementation());
check(SenseID.IsValid());
GetPerceptionComponent()->UpdatePerceptionWhitelist(SenseID, true);
AIPerceptionSys->UpdateListener(*GetPerceptionComponent());