일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 언리얼
- 디자인패턴
- effectivec++
- Unreal Engine
- BehaviorTree
- 포인터
- AI
- 게임프로그래밍패턴
- 게임 개발
- 데이터구조
- Unreal Engine5
- 언리얼엔진5
- 프로그래밍
- 복사대입연산자
- 게임개발
- UE5
- cpp개발
- C++
- 자료구조
- 배열
- 소멸자
- 언리얼 엔진5
- 복사생성자
- 언리얼엔진
- C언어
- 언리얼5
- 프로세스
- CPP
- 생성자
- Unreal
- Today
- Total
리얼 개발
[UE5] AIPerception 본문
언리얼의 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) 구조체도 반환한다.
다음은 공식문서의 글이다.
퍼셉션 함수 호출
다음 함수는 블루프린트를 통해 호출되어 퍼셉션 시스템에서 정보를 구하거나 퍼셉션 시스템에 영향을 미칠 수 있습니다.
액터 퍼셉션 구하기(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의 주요 필드
- WasSuccessfullySensed()
- 자극이 성공적으로 감지되었는지 여부를 반환하는 함수.
- *true*면 AI가 자극을 성공적으로 감지한 상태를 의미하고, **false*면 자극이 더 이상 감지되지 않음을 나타낸다.
- StimulusLocation
- 자극이 발생한 월드 좌표를 나타낸다.
- AI가 감지한 대상의 위치를 기반으로 행동할 수 있다.
- ReceiverLocation
- AI가 자극을 감지한 위치를 나타낸다.
- AI의 위치와 자극의 위치가 다를 수 있기 때문에, AI가 자극을 수신한 좌표도 포함된다.
- Age
- 자극이 감지된 후 경과한 시간을 나타낸다. 이를 통해 자극이 얼마나 오래된 정보인지를 판단할 수 있다.
- Tag
- 자극에 관련된 GameplayTag. 특정 태그를 기반으로 AI가 자극을 처리하는 방식에 차이를 둘 수 있다.
- 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 |