虚幻C++ 设置AI的按归属检测(Detection by Affiliation)

我在设置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应该就不会互相追踪了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值