UE4 AIPerception和AIPerceptionStimuliSource

一、

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());
发布了144 篇原创文章 · 获赞 15 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/maxiaosheng521/article/details/103352122