인공지능을 제작할 때, 인공지능의 인지능력을 개발해야하는 상황이 생긴다.
인지능력의 예로는,
주변 객체들을 시각적으로 인지함,
주변 객체의 소리를 인지함,
주변 객체로부터의 공격을 인지함,
등의 상황을 생각해볼 수 있다.
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로 여러가지 인지능력의 세팅값을 넣어줄 수 있다.
이제 시야에 대한 인지와, 공격에 대한 인지가 가능한 인공지능을 제작할 수 있다.
'게임 엔진 > Unreal' 카테고리의 다른 글
[Unreal] 언리얼 메모리 관리 시스템 (Smart Pointer, GC) (5) | 2021.01.19 |
---|---|
[Unreal] 언리얼 엔진 디버깅 (0) | 2021.01.12 |
[Unreal] 테이블 데이터 이용 방법 (DataTable) (0) | 2020.12.30 |
[Unreal] [Example] Delegate 사용방법 (1) | 2020.12.29 |
[Unreal] [Example] 타이머 이용 방법 (Timer) (0) | 2020.12.15 |