🎮Unreal4/C++

[UE4] EnemyAI -8 : 회피(Avoid) - EQS, Warp (UEnvQueryContext)

공대 컴린이 2023. 8. 9. 15:27
728x90

원거리 Enemy는 Target이 일정범위 이상 가깝게 다가오면 회피를 수행하도록 구현했다.

이때, 회피는 플레이어가 사용하던 Warp 무기를 사용하였다.

💻 DoAction_Warp 클래스 수정하기

플레이어만 사용하던 DoAction_Warp 클래스를 Enemy도 함께 사용하기 위해 조금 수정해주었다.

공격을 시작하는 Begin_DoAction 함수에서 PlayerController의 NULL 판단을 통해 해당 함수를 호출하는 Owner가 플레이어인지, Enemy인지 구분하였다.

 

Enemy인 경우, Behavior 컴포넌트에 블랙보드 키 값으로 저장해둔 Avoid Location을 불러와 캐릭터의 위치를 변경해주었다.

 

위에서 말한 블랙보드의 회피 위치 키 값은 Vector 자료형으로 선언하였다.

 

여기서 사용되는 '회피 지점'은 EQS를 통해 구현하였다.

📌 EQS

EQS를 애셋을 생성하고, 루트노드의 하위 노드로 OnCircle 제너레이터를 사용했다.

하위 테스트로는 내적(Dot)을 등록하였다.

 

내적으로는 Target → Querier 과, Target → Item의 두 벡터를 설정했는데, 여기서 Target Context는 C++ 클래스로 직접 생성한 클래스이다.

 

Context에 대한 설명은 아래에서 마저 하기로 하고, 노드를 보자면,

해당 EQS를 실행시키는 Querier(질문자)의 주변으로 원형 아이템을 생성하라는 제너레이터를 사용했다.

이때 Querier는 Enemy_AI_Range가 될 것이다.

 

이후, 테스트 조건으로 Dot2D 를 사용했다.

Target은 플레이어가 될 텐데, 플레이어 → Enemy와 플레이어 → Item을 내적하여 가장 높은 점수를 갖는 아이템 지점을 선택하였다.

Filter TypeMaximum 0.5로 설정하여 Score가 0.5 이상인 경우 전부 무시하도록 하였고, 

Scoring EquationInverse Linear로 설정하여 최종 점수가 산출될 때 0에서 1이 아닌, 1에서 0으로 반전되어 출력되도록 설정했다. (원래 내적 값이 클 수록 정면에 가깝게 위치한 것인데, 회피는 반대방향으로 해야 하므로 Inverse를 적용함)

 

이렇게되면 EQS가 발동되는 순간, Target의 시야의 뒷편인 부분이 내적의 가장 높은 점수를 가져 Enemy가 해당 지점으로 회피할 수 있게 된다.

🐸 UCEnvQueryContext_Target 

테스트에 사용될 EnvQueryContext로 블랙보드에 등록된 Target을 불러와야 하기 때문에 UEnvQueryContext를 상속받는 UCEnvQueryContext_Target 클래스를 생성해주었다.

 

ProvideContext 함수쿼리의 Context 정보를 제공하기 위해 사용되는 함수이다.

해당 함수를 실행시키는 QueryInstance의 Owner도 결국 Enemy_AI_Range이기 때문에, 해당 매개변수를 통해 블랙보드의 Target 키 값까지 접근할 수 있다.

 

AActor로 Target을 가져왔다면, UEnvQueryItemType_Actor를 사용해 Context Data를 초기화 해 주었다.

 

이후, 비헤이비어 트리에서 Avoid 상태가 되는 경우 Warp 무기를 Equip하고, EQS 쿼리를 실행시킨 후, 이때 초기화 된 Avoid_Location 지점으로 순간이동하는 Action을 발동시켰다.

 

컴파일 후 프로젝트를 실행시켜보면, 플레이어가 Enemy에게 가까이 다가갔을 때, Enemy가 Warp 액션을 수행하며 플레이어의 뒷 편으로 순간이동 회피하는 것을 확인할 수 있었다.

 


 

https://docs.unrealengine.com/5.0/ko/eqs-node-reference-generators-in-unreal-engine/

 

언리얼 엔진의 EQS 노드 레퍼런스: 제네레이터

제네레이터가 EQS 시스템에서 어떻게 사용되는지 설명합니다.

docs.unrealengine.com

https://docs.unrealengine.com/5.0/ko/environment-query-system-in-unreal-engine/

 

인바이런먼트 쿼리 시스템

인바이런먼트 쿼리 시스템(EQS)이 무엇인지, 이 시스템으로 어떻게 환경 데이터를 쿼리하는지 설명합니다. 그런 다음 이 데이터를 AI가 취할 행동을 결정하는 프로세스에 사용하도록 제공할 수

docs.unrealengine.com

 

728x90