리얼 개발

[UE5] AIPerception 본문

Unreal Engine5

[UE5] AIPerception

econo-my 2024. 11. 5. 21:13

언리얼의 AI 시스템은 다음과 같은 기능들이 있다.

 

Perception - EQS - Behavior Tree

 

BehaviorTree : 실행할 로직을 결정

Environment Query System : 환경 정보를 구함

AI Perception System : 자극 소스(Stimuli Source) 를 수집

AI에게 명령을 내리는 과정을 나타낸 사진이다.

 

 

Perception

Perception은 "지각" 이란 뜻을 가진 단어로, AI가 시야, 대미지, 소리 등의 감각을 가질 수 있게 만들어주는 기능 중 하나다.

 

자극 소스가 등록되면 퍼셉션 업데이트 시(On Perception Updated) 또는 타깃이 선택된 경우 타깃 퍼셉션 업데이트 시(On Target Perception Updated) 이벤트를 호출하여 새 블루프린트 스크립트를 실행하거나 비헤이비어 트리의 브랜치를 검증하는 데 사용되는 변수를 업데이트 할 수 있다.

/* AIController 클래스 헤더파일에 존재하는 PerceptionComponent 멤버변수 */
UPROPERTY(VisibleDefaultsOnly, Category = AI)
TObjectPtr<UAIPerceptionComponent> PerceptionComponent;
/* UActorComponent를 상속 받음 */
UCLASS(ClassGroup=AI, HideCategories=(Activation, Collision), meta=(BlueprintSpawnableComponent), config=Game, MinimalAPI)
class UAIPerceptionComponent : public UActorComponent
{
	
}

 

AI 퍼셉션 프로퍼티

AIController에 퍼셉션 컴포넌트를 부착하면 디테일 패널에서 AI가 지각 가능한 것들이 뜬다.

 

💡주도적인 감각(Dominant Sense)

프로퍼티를 사용하면 감각된 액터의 위치를 결정할 때 다른 감각보다 우선할 감각을 할당할 수 있습니다. 이는 감각 환경설정 섹션에서 환경설정한 감각 가운데 하나로 설정하거나 없음(None)으로 설정해야 합니다.

 

AI 대미지

 

AI 청각

 

AI 예측

 

AI 시각

 

AI 팀

 

AI 촉각

 

퍼셉션 이벤트

이벤트 섹션에서는 AI퍼셉션 시스템이 업데이트를 수신하거나 AI 퍼셉션 컴포넌트가 활성화 또는 비활성화되어 있을 때 어떤 일이 일어나는지 정의할 수 있다.

 

이벤트에 대비한 델리게이트가 아래와 같이 정의되어 있다.

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FPerceptionUpdatedDelegate, const TArray<AActor*>&, UpdatedActors);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FActorPerceptionForgetUpdatedDelegate, AActor*, Actor);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FActorPerceptionUpdatedDelegate, AActor*, Actor, FAIStimulus, Stimulus);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FActorPerceptionInfoUpdatedDelegate, const FActorPerceptionUpdateInfo&, UpdateInfo);

UPROPERTY(BlueprintAssignable)
FPerceptionUpdatedDelegate OnPerceptionUpdated;

UPROPERTY(BlueprintAssignable)
FActorPerceptionForgetUpdatedDelegate OnTargetPerceptionForgotten;

UPROPERTY(BlueprintAssignable)
FActorPerceptionUpdatedDelegate OnTargetPerceptionUpdated;

UPROPERTY(BlueprintAssignable)
FActorPerceptionInfoUpdatedDelegate OnTargetPerceptionInfoUpdated;

OnPerceptionUpdated

  • 이 이벤트는 인식 시스템이 업데이트를 수신하면 시작되며 업데이트 신호를 보낸 액터 어레이가 반환된다.

OnTargetPerceptionInfoUpdated

  • 이 알림은 수신되는 모든 자극에 대해, 또는 자극 환경설정에 따라 스테이트가 변경될 때 브로드캐스트된다.

OnTargetPerceptionUpdated

  • 이 이벤트는 퍼셉션 시스템이 업데이트를 수신할 때 실행되어 업데이트 신호를 보낸 액터를 반환한다. 또한 분석하여 추가 정보를 얻을 수 있는 AI 자극(AI Stimulus) 구조체도 반환한다.

 

 

다음은 공식문서의 글이다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/ai-perception-in-unreal-engine?application_version=5.4

 

퍼셉션 함수 호출

다음 함수는 블루프린트를 통해 호출되어 퍼셉션 시스템에서 정보를 구하거나 퍼셉션 시스템에 영향을 미칠 수 있습니다.

액터 퍼셉션 구하기(Get Actors Perception) 지정된 액터에 대해 무엇이 감각되었는지 구하고 감각된 액터의 데이터 구조체를 반환합니다.
현재 인지된 액터 구하기(Get Currently Perceived Actors) 지정된 감각을 바탕으로 인지되고 있는 모든 액터를 반환합니다. 감각을 지정하지 않으면 어떤 방식으로든 현재 인지되고 있는 액터가 모두 반환됩니다.
알려진 인지된 액터 구하기(Get Known Perceived Actors) 지정된 감각을 바탕으로 인지되었고 아직 잊히지 않은 모든 액터를 반환합니다. 감각을 지정하지 않으면 인지된 액터가 모두 반환됩니다.
인지된 적대 액터 구하기(Get Perceived Hostile Actors) 만료되지 않았거나 성공적으로 감각된 자극이 있는 적대 액터의 목록을 반환합니다. 사용자가 원하는 액터 목록을 반환하도록 블루프린트에서 메서드를 오버라이드할 수 있습니다.
자극 리스너 업데이트 요청(Request Stimuli Listener Update) AI 퍼셉션 시스템이 지정된 타깃 자극 리스너에 대해 프로퍼티를 업데이트하도록 수동으로 강제합니다.
감각 활성화 설정(Set Sense Enabled) 지정된 감각 클래스(Sense Class) 를 활성화하거나 비활성화합니다.
지정된 감각이 타깃 컴포넌트 인스턴스에 대해 이미 환경설정된 경우에만 작동합니다.  

 

자극 소스

AI 퍼셉션 자극 소스(AI Perception Stimuli Source) 컴포넌트를 사용하면 소유 액터가 스스로를 자동으로 퍼셉션 시스템 내에서 지정된 감각에 대한 자극 소스로 등록할 수 있습니다. 사용 사례의 예시로는 시각 기반 자극을 인지하도록 구성된 AI 퍼셉션 컴포넌트를 가진 AI 캐릭터를 만드는 것을 들 수 있습니다. 그런 다음 아이템 획득 액터 등 액터 내의 스티뮬라이 소스 컴포넌트를 시각에 대한 자극으로 등록합니다. 그러면 AI가 해당 액터를 레벨 내에서 '볼' 수 있게 됩니다.

 

자극 함수 호출

다음 함수는 블루프린트를 통해 AI 퍼셉션 자극 소스 컴포넌트에 호출될 수 있습니다.

함수 설명

감각에 대해 등록(Register for Sense) 소유 액터를 지정된 감각 클래스의 자극 소스로 등록합니다.
퍼셉션 시스템에 등록(Register with Perception System) 감각에 대해 등록 함수 호출을 통해 소유 액터를 감각에 대한 소스로 등록 프로퍼티에 지정된 감각의 자극 소스로 등록합니다.
'소스로 자동 등록' 프로퍼티가 활성화되어 있는 경우 이 함수를 호출할 필요가 없습니다.  
퍼셉션 시스템에서 등록 해제(Unregister from Perception System) 소유 액터를 감각 자극의 소스에서 등록 해제합니다.
감각에서 등록 해제(Unregister from Sense) 지정된 감각의 자극을 소유 액터에 대해 등록 해제합니다.

 

AI 퍼셉션 디버깅

게임이 실행 중일 때 '(아포스트로피)를 눌러 AI 디버깅 툴로 AI 퍼셉션을 디버깅할 수 있습니다. 퍼셉션 정보를 표시하려면 숫자 패드 4를 누르면 됩니다.


OnTargetPerceptionUpdated

  • 여러 감지된 대상들에 대한 정보를 한 번에 받아서 처리할 수 있음
  • AI의 감각 시스템에서 하나 이상의 자극이 감지될 때마다 호출됨

OnPerceptionUpdated

  • 특정 대상의 퍼셉션이 업데이트될 때 호출됨
  • 대상을 새롭게 감지하거나, 더 이상 감지하지 못하게 되었을 때 각각 호출Perception 단어 뜻 : 지각BehaviorTree : 실행할 로직을 결정AI Perception System : 자극 소스(Stimuli Source) 를 수집

 

관련 클래스

AIPerception과 관련된 클래스들을 살펴보자.

 

UAIPerceptionComponent

Perception 기능을 사용하기 위해 부착해야하는 컴포넌트

Senses Config 에 등록된 감각 (대미지, 시야, 소리) 등을 감지할 수 있음

 

UAISenseConfig

UAISense에 대한 설정을 정의하는 클래스로 AI가 특정 감각을 어떻게 사용할지에 대한 설정값(시야 거리, 각도 등)을 저장하고 감각을 사용할 때의 속성을 설정하는 역할을 한다.

virtual TSubclassOf<UAISense> GetSenseImplementation() const;

TSubclassOf<UAISense> 형식의 인자에 저 함수를 넣을 수도 있고

TSubclassOf<UAISense> AISense = UAISense_Sight::StaticClass(); 대입이 가능하다.

 

UAISense

감각 처리 로직을 담당하며, 감각 데이터를 어떻게 AI에게 제공할지 정의한다.

OnTargetPerceptionUpdated, OnPerceptionUpdated 델리게이트의 브로드캐스트 주기는 AI가 새로운 자극을 감지하거나 기존 자극을 더 이상 감지하지 않을 때 발생한다.

  • 감지시
    • AI 가 감지할 수 있는 범위에 새로운 대상이 들어올 때
  • 감지 해체 시
    • 감지된 대상이 범위를 벗어나거나 시야에서 사라지는 등 더 이상 자극이 없을 때
  • 업데이트
    • 감각의 상태가 변할 때마다, 예를 들면 대상의 위치가 바뀔 때

 

센스(Sense)의 업데이트 주기

센스(예: 시각, 청각 등)의 업데이트 주기는 감각 설정에서 MaxAge나 SenseInterval 같은 파라미터에 의해 제어됩니다. 예를 들어, UAISense_Sight의 경우:

  • SightConfig->SetMaxAge(float Age): 감지된 자극이 유효한 최대 시간을 설정합니다. 이 값이 지나면 자극은 만료되어 더 이상 감지되지 않게 됩니다.
  • SightConfig->SightRadius 및 LoseSightRadius: 대상이 감지 범위 내에 있는지 여부에 따라 델리게이트 호출 주기가 결정됩니다.
SightConfig->SetMaxAge(5.0f);  // 자극이 5초 동안 유효
SightConfig->DetectionByAffiliation.bDetectEnemies = true;
AIPerception->ConfigureSense(*SightConfig);

이 설정에서는 AI가 적을 감지하면 그 자극은 최대 5초 동안 유효하며, 해당 기간 동안 계속 업데

이트됩니다. 대상이 사라지거나 감지되지 않으면 델리게이트가 트리거됩니다.

 

UAIPerceptionStimuliSource

AI가 탐지하고 싶은 액터에 붙이는 컴포넌트

AI가 해당 캐릭터를 감지할 수 있도록 자극원으로 등록하는 역할

 

FAIStimulus

퍼셉션 시스템에서 AI가 감지한 자극 에 대한 정보를 저장하는 구조체이다. AI가 어떤 자극을 감지했는지, 그 자극의 세부 정보를 포함하여 관리한다.

자극이 성공적으로 감지되었는지, 또는 더 이상 감지되지 않는지를 확인 가능하다.

 

 

FAIStimulus의 주요 필드

  1. WasSuccessfullySensed()
    • 자극이 성공적으로 감지되었는지 여부를 반환하는 함수.
    • *true*면 AI가 자극을 성공적으로 감지한 상태를 의미하고, **false*면 자극이 더 이상 감지되지 않음을 나타낸다.
  2. StimulusLocation
    • 자극이 발생한 월드 좌표를 나타낸다.
    • AI가 감지한 대상의 위치를 기반으로 행동할 수 있다.
  3. ReceiverLocation
    • AI가 자극을 감지한 위치를 나타낸다.
    • AI의 위치와 자극의 위치가 다를 수 있기 때문에, AI가 자극을 수신한 좌표도 포함된다.
  4. Age
    • 자극이 감지된 후 경과한 시간을 나타낸다. 이를 통해 자극이 얼마나 오래된 정보인지를 판단할 수 있다.
  5. Tag
    • 자극에 관련된 GameplayTag. 특정 태그를 기반으로 AI가 자극을 처리하는 방식에 차이를 둘 수 있다.
  6. Strength
    • 감지된 자극의 강도를 나타낸다. 예를 들어, 소리가 감지될 때 소리의 크기가 클수록 높은 강도로 인식될 수 있다.

 

GetActorsPerception

UAIPerceptionComponent.h 에 선언되어 있다.

bool UAIPerceptionComponent::GetActorsPerception(AActor* Actor, FActorPerceptionBlueprintInfo& Info)
{
	bool bInfoFound = false;
	if (Actor != nullptr && Actor->IsPendingKillPending() == false)
	{
		const FActorPerceptionInfo* PerceivedInfo = GetActorInfo(*Actor);
		if (PerceivedInfo)
		{
			Info = FActorPerceptionBlueprintInfo(*PerceivedInfo);
			bInfoFound = true;
		}
	}

	return bInfoFound;
}

GetActorInfo(*Actor) 를 통해 Actor가 가지고 있는 Perception 정보들을 가져오나 보다.

UAIPerceptionComponent.h 에 선언되어 있다.

FORCEINLINE const FActorPerceptionInfo* GetActorInfo(const AActor& Actor) const 
{ 
	return PerceptualData.Find(&Actor); 
}

PerceptualData.Find를 보면 Key값을 가지는 컨테이너라는 것을 추측해볼 수 있다. 실제로 봐보면

UAIPerceptionComponent.h 에 선언되어 있다.

FActorPerceptionContainer PerceptualData;

typedef TMap<TObjectKey<AActor>, FActorPerceptionInfo> TActorPerceptionContainer;
typedef TActorPerceptionContainer FActorPerceptionContainer;

이런식으로 타고 올라갈 수 있으며 결국 TMap으로 된 컨테이너가 나온다.

 

정리해보자면 아웃 매개변수로 선언된 FActorPerceptionBlueprintInfo& Info 에 AI가 감지하고자 하는 액터의 Perception 데이터를 넣어주는 것으로 볼 수 있다.

 

'Unreal Engine5' 카테고리의 다른 글

[UE5] 데이터 테이블  (0) 2025.03.02
[UE5] 모션워핑과 풀바디 IK  (0) 2024.10.16
[UE5] 언리얼 빌드 시스템  (1) 2024.09.12
[UE5] 무기 선택 창으로 무기 교체하기  (0) 2024.09.11
[UE5] Vector 클래스 분석  (0) 2024.09.04