게임 엔진/Unreal

[Unreal] [Example] 인공지능 에이전트 (AISense)

AlgorFati 2021. 1. 10. 17:46

인공지능을 제작할 때, 인공지능의 인지능력을 개발해야하는 상황이 생긴다.

인지능력의 예로는,

주변 객체들을 시각적으로 인지함,

주변 객체의 소리를 인지함,

주변 객체로부터의 공격을 인지함,

등의 상황을 생각해볼 수 있다.

 

AISense를 사용하기 위해서는 필요한 객체들은 다음과 같다.

1. 인공지능이 들어간 객체 (Pawn)

2. 인지능력을 통해 Pawn을 조종할 객체 (AIController)

3. 인지능력들을 관리할 객체 (AIPerception)

4. 추가될 인지능력들 (AISense_Sight, AISense_Damage)

 

 

Pawn (AAICharacter.cpp)

// 공격을 받으면 이 함수를 호출해준다.
// ex) Player가 인공지능을 공격 시, Player의 함수에서 이 함수를 호출
bool AAICharacter::TakeDamage(const FHitData& HitData)
{
	if (HitData.Damage != 0.0f)
	{
		ReportDamage(HitData);
		// ..
		return true;
	}
	return false;
}

// Damage를 받았다는 사실을 리포트한다.
// 이를 통해 AIPerception에서 공격자를 인지할 수 있게 된다.
// AIPerception->GetKnownPerceivedActors(nullptr, OutActors); 를 통해 참조할 수 있다.
void AAICharacter::ReportDamage(const FHitData& InHitData)
{
	UAISense_Damage::ReportDamageEvent(
		GetWorld(), 
		this,
		InHitData.DamageCauser, 
		InHitData.Damage,
		InHitData.DamageCauser->GetActorLocation(),
		GetActorLocation());
}

Blueprint에서 이 캐릭터에 이후 제작할 ABaseAIController의 Blueprint를 넣어주어야 한다.

 

 

AIController (ABaseAIController.cpp)

// Timer를 이용하여 UpdateTarget 함수를 매초 실행시킨다.
void ABaseAIController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	PossesedAICharacter = Cast<AAICharacter>(InPawn);

	if (GameUtils::IsValid(PossesedAICharacter))
	{
		RunBehaviorTree(PossesedAICharacter->GetBTree());
		FTimerHandle UpdateTargetTimerHandle;
		GetWorld()->GetTimerManager().SetTimer(
			UpdateTargetTimerHandle, this, &ABaseAIController::UpdateTarget, 1.0f, true);
	}
}

// AIPerception->GetKnownPerceivedActors(nullptr, OutActors); 를 통해 인지된 모든 객체를 가져온다.
// AIPerception->GetKnownPerceivedActors(UAISense_Damage::StaticClass(), OutActors); 와 같이 하면
// 특정 인지능력으로 인한 객체들만 참조할 수 있다.
void ABaseAIController::UpdateTarget()
{
	TArray<AActor*> OutActors;
	AIPerception->GetKnownPerceivedActors(nullptr, OutActors);
	for (AActor* Actor : OutActors)
	{
    	//..
	}
}

 

AIPerception & (AISight, AIDamage)

AIPerception은 AIController의 컴포넌트로 다음과 같이 제작한다.

AIPerception의 config로 여러가지 인지능력의 세팅값을 넣어줄 수 있다.

 

이제 시야에 대한 인지와, 공격에 대한 인지가 가능한 인공지능을 제작할 수 있다.