🎮Unreal4/C++

[UE4] EnemyAI -3 : 시야 감지, TeamID (UAIPerceptionComponent, UAISenceConfig_Sight, IGenericTeamAgentInterface)

공대 컴린이 2023. 7. 6. 16:35
728x90

EnemyAI의 첫번째 기능으로 적 감지 기능을 구현해보았다.

🕶️ AI Perception Component

AIController 클래스에 감지 역할을 수행하는 UAIPerceptionComponent를 선언하였다.

 

OnPerceptionUpdated 함수는 UAIPerceptionComponent에 존재하는 Perception->OnPerceptionUpdated 델리게이트에 등록하기 위한 함수이다.

 

또한 감지의 종류 중 하나인 '시야 감지'를 구현하기 위해 UAISenceConfig_Sight 변수를 선언해주었다.

시야 감지 말고도 소리, 데미지 감지 등등은 모두 UAISenseConfig를 상속받아 구현되어져 있다.

 

AIController의 생성자에서는 Perception Component를 초기화하고, UAISenceConfig_Sight를 동적할당 해주었다.

 

이후, Sight의 감지 범위(SightRadius)와, 감지를 잃는 범위(LoseSightRadius), 감지 각도(PeripheralVisionAngleDegree), 인식한 정보의 유효범위(SetMaxAge)를 각각 설정해주었다.

 

추가로 DetectionByAffiliation을 설정해주었는데, 블루프린트에서는 셋 중 하나만 활성화시킬 수 있었지만, C++ 프로젝트에서는 원하는 대상을 모두 감지 대상으로 설정할 수 있다는 특징이 있다.

 

설정이 완성된 Sight는 Perception 컴포넌트의 ConfigureSense 함수를 통해 감지방법을 전달하고, SetDominantSense 함수를 통해 감지 우선순위를 지정해주었다.

 

BeginPlay에서는 지속적인 Perception Updated를 위한 델리게이트 함수를 등록해주었다.

 

OnPerceptionUpdated 함수에서는 감지 범위 내에 들어온 Actor들을 배열에 저장하고, 

해당 Actor의 이름을 출력하는 로그를 테스트로 출력해보았다.

👩🏻‍🤝‍👨🏻Team ID 설정

AI Controller에서는 Enemy 끼리의 아군, 적군, 중립을 구별하기 위해 Team ID라는 속성이 존재한다.

 

중립

Team ID는 0부터 255까지 지정할 수 있고, ID가 같으면 아군이고 다르면 적군이며, 255는 중립을 의미한다.

 

EnemyAI의 TeamID는 Default 값을 2로 설정해두었다.

 

또한 Player도 Enemy와 ID를 분리해줘야 하기 때문에, IGenericTeamAgentInterface 인터페이스를 상속받아 TeamID를 지정해주었다. 

Enemy가 2이고, Player를 1로 지정하였다.

 

CPlayer.h

또한 IGenericTeamAgentInterface 인터페이스에 GetGenericTeamId 함수는 무조건 NoTeamId를 반환하도록 만들어져 있기 때문에 설정한 TeamID(1)가 반환될 수 있도록 함수를 오버라이드 해주었다.

 

컴파일 후 실행시켜보면 Enemy의 감지가 잘 실행되고, 아까 테스트로 찍어둔 Log에 Player가 정상 출력되는것을 확인할 수 있었다.

728x90