🔥 장거리 AI : BT_Range
장거리 Enemy AI 를 구현해보았다. 근접 AI 였던 BT_Melee와 거의 비슷하지만 몇몇 다른부분만 살펴보도록 하자.
1. 장거리 공격 기능 (BT_Range)
장거리 AI는 감지범위(1000)에 들어오면 감지를 시작하고, Avoid Distance(500) 밖에 위치하면 장거리 공격으로 FireBall을 쏘도록 구현하였다. 반대로 Avoid Distance안에 위치하면 Enemy가 플레이어와 가까워지지 않도록 회피하는 기능을 구현하였다.
장거리 AI는 순찰이나 추적기능을 전부 제외하고, 위치에 서있다가 범위에 들어오면 플레이어를 공격하고, 가까워지면 회피하는 구조로 구현하였기 때문에 비헤이비어 트리도 위와 같이 작성하였다.
다음과 같이 일정범위 안에 들어가면 Enemy AI 가 장거리 공격으로 FireBall을 성공적으로 날렸다.
2. 회피 기능
회피 기능을 구현하기 위해선 EQS 라는 개념을 이해해야 한다.
💡 EQS란? (Environment Query System, 환경 질의 시스템)
언리얼의 막강한 AI 기능인 EQS를 한국어로 하면 환경 질의(질문) 시스템인데, 여기서 질문은 내가 원하는 조건의 위치가 존재하는지에 관한 질문이다. EQS는 공간을 먼저 그리고, 그 공간 안에서 내가 원하는 지점을 Return시켜주며 동작한다.
예를들면, 몬스터가 피가 닳았을 때 플레이어에게 안보이도록 최대한 멀고, 숨을 수 있는 위치를 찾기위해 EQS를 사용하여 해당 위치를 찾고 Return 받을 수 있다.
또는 아군 AI가 있을때 어느 지점,구역을 들어가게 되면 적들이 존재할 때 은폐/엄폐를 위해 숨어야하는데, 나의 가장 가까운 위치로부터 적의 시야에 보이지않을 위치를 찾아달라고할 수 있다.
추가적으로 위치 뿐만아니라 액터도 찾을 수 있다. (나는 위치만 사용해보았다)
즉, 정말 간단히 말해 EQS는 특정 공간을 찾는 기능인데, 내가 구현하고 있는 Enemy AI에서는 플레이어와 Enemy의 간격이 500 안으로 가까워질 때 플레이어의 뒷 지점으로 순간이동(Warp)하기 위해 사용할 것이다.
(EQS는 매우 복잡하기 때문에 지금은 간단히 어떻게 사용하는지 정도만 사용해보았다)
EQS를 구현하기 위해 위와 같은 네가지 EQ 관련 클래스를 생성하였다.
EQ를 구현할 비헤이비어 트리에서 EQS 쿼리를 수행하는 Run EQS Query 노드를 추가하였다.
Run EQS Query는 위처럼 Task로 놓을수도 있고, 서비스로 사용할수도 있다. 서비스는 실시간으로 판단하는 경우에 사용된다.
Run EQS Query에 블랙보드 Key를 설정해야하는데, Actor거나 Location이어야 한다. 나는 이동할 위치를 찾기 위해 블랙보드에 EQ_Location이라는 Vector형 Key를 생성하여, Run EQS Query의 블랙보드 키로 설정하였다.
EQS는 질의할 공간인 Query Template을 설정해줘야하기 때문에 EQ_Exam 클래스를 만들어 설정해주었다.
이렇게 질문할 공간을 생성하는 것을 Generators 라고 부른다.
Actor Of Class는 액터 전체를 가지고 공간을 만들고, Circle은 원 모양의 공간, Cone은 콘 모양, Grid는 Grid 모양, 이름과 같은 모양으로 질의 공간을 생성한다.
우선 사각형 Grid의 공간을 생성하였다.
이렇게 만들어놓은 EQ 비헤이비어 트리를 적용시킨 Enemy_AI_EQ를 뷰포트에 배치하고, 디버그모드( ' )를 실행시킨 후 숫자패드 3번을 누르면 EQS 디버그 모드가 시작된다.
생성했던 Grid 모양의 공간이 생기고, 각 공간마다 점수가 매겨져있는 모습을 확인할 수 있다.
이제는 인바이런먼트 쿼리 노드에 테스트를 추가하여 질문을 턴지고 답을 받도록 하였다.
Test Purpose를 Score Only로 설정하여 공간 별 점수를 매기고, Test Mode를 Distance 2D로 설정하여 단순 거리를 비교하도록 하였다.
디버그 모드로 확인한 결과 생성된 그리드별로 점수를 매기기 시작하고 결과적으로 점수가 가장 높은 위치를 반환해주는 질의 결과가 나올 것이다.
다음엔 이런 EQS기능을 사용하여 Enemy AI 회피 기능을 구현해 볼 것이다.