EQS 란?
언리얼 엔진의 EQS는 Environment Query System의 약자로 Behavior Tree내에서 다양한 테스트를 통해 환경을 조사하고
테스트 결과를 바탕으로 어떻게 진행할 것인지 결정하는 시스템을 말한다
Querier는 질의자로, 해당 EQS를 실행하게 될 객체를 의미한다
주로 적 AI에게 Behavior Tree를 주고 그 안에서 Run EQS 를 하게 되니 Querier는 적AI가 되게 된다
Debug
EQS가 잘 돌아가고 있는지 디버깅 하려면 실행 후 플레이어에 빙의한 뒤 ' (단따옴표) 키를 눌러 디버깅 모드로 들어가고
키패드에 3번을 누르면 EQS디버깅 모드가 된다
디버깅 모드 우측 상단에 Debug Actor가 뜨는데 내가 확인하고 싶은 AI가 Deubg Actor로 잘 잡혔나 확인해주면 된다
EQS에서 Filter 조건이 걸려있다면 Filter된 곳들은 파란색으로, 후보로 올라가 있는 곳들은 초록색으로 뜨며
Score를 정상적으로 매겼다면 Filter된 지점을 제외한 모든 지점에 Score가 표시되고
조건에 가장 충족한 곳이 Winner라고 적혀져 리턴된다
Run EQS
EQS의 실행은 Behavior Tree에서 Run EQS Query 태스크를 통해 수행한다
Query Template에 만들어둔 쿼리를 넣어주고, Run Mode는 EQS를 통해 나오는 결과의 Single Best(최고 하나), Random Best 5%, Random Best 25%, All matching(조건에 맞는 모든 것)을 선택할 수 있다
Blackboard Key는 EQS를 통해 산출된 결과를 블랙보드 키로 받을 수 있는데, 그 값을 어떤 키로 받을지 선택하는 것이다
Generator
EQS를 실행하면 먼저 Generator로 공간? 범위? 를 생성한다
Circle, Cone, Grid등 다양한 모양으로 생성가능하다
Circle의 디테일을 살펴보자
몇 가지만 알아두면 다른 디테일들은 쉽게 예상 가능하다
항목은 단순하다
원 반지름 : 말 그대로 반지름을 설정한다
Space Between : 생성될 지점들 사이의 간격
Number Of Points : 공간의 개수를 몇 개로 지정할 것인지
Point on Circle Spacing Method : 위의 Space Between과 Number Of Points 중 어떤 방법을 사용할건지
Arc Angle : 원에서 몇 도를 사용할건지 ( 360도보다 작게 설정하여 호의 모양으로 사용 가능)
원 중앙 : 어떤 객체를 기준으로 원을 그릴건지
여기서 생성하는 공간을 EQS를 실행하게 되는 AI가 아닌 플레이어를 중심으로 생성하고 싶다? 하면
플레이어 정보를 EQS에게 제공해줘야한다
이렇게 EQS에게 정보를 제공하는 것은 EnvQueryContext라는 클래스에서 할 수 있다
EnvQueryContext를 통해 객체를 제공할 수도, 특정 지점을 제공할 수 도 있다
Grid
Grid HalfSize : 그리드의 사이즈 * 1/2
Space Between : 그리드 사이 간격
Gnerate Around : 그리드의 중심
Test
Generator에서 조사할 공간을 만들었다면
그 후 테스트를 추가하여 원하는 지점을 필터링해내는 과정이 들어간다
Test도 Distance, Trace, Dot..등 다양하게 있다
내가 원하는 조건을 위한 테스트를 선택하여 Score와 Filter을 거쳐
테스트를 통과한 공간을 리턴하도록 설정한다
Score는 점수를 매기는 것, Filter는 조건에 맞지 않은 부분을 걸러내는 것이다
Score는 기본적으로 0~1로 표시되며 가장 큰 값이 Winner가 된다
Test가 여러 개일 경우 Score는 각 Test마다 누적된 값으로 나온다
Data Binding의 Query Params는 프로그래밍을 통해 값을 주는 것이고
Random Num는 Min~Max의 범위 내에서 랜덤한 값을 주는 것을 의미한다
각 테스트를 설정하는 방법을 살펴보자
Distance
Test Purpose
테스트를 수행할 때 Score만 사용할건지, Filter만 사용할건지, 둘 다 사용할건지
Filter
Maximum을 500으로 필터링하면 거리가 500이상인 곳들이 제외된다
Filter에서 주는 값은 항상 실제값이며 점수값이 아님을 주의해야한다
반대로 Minimum을 500으로 필터링하면 거리가 500이하인 곳들이 제외된다
Filter에서 주는 값들은 필터링하고 싶은, 제외하고 싶은 값을 주는 것이다
Scoring Equation - Linear
말 그대로 Linear하게 점수가 매겨진다
따라서 Score가 가장 높은 곳이 결과로 리턴된다
반대로 Inverse Linear를 선택하면
Score가 가장 낮은 곳이 결과로 리턴된다
Querier(현재 AI)와의 거리가 500 이상인 지점은 필터링되어 파란색으로 되어있다
초록색의 필터링 되지 않고 남은 후보들 중
내가 Behavior Tree에서 선택한 Random Best 25%에 해당되는 공간이 Winner로 선택되게 된다
Random Best 25%를 선택했기에 점수가 가장 높은 1점이 아닌 0.82점이 선택되었다
(당연히 1점이 선택될 수도 있다 Random이니까)
Trace
Trace Channel은 우리가 프로젝트 세팅에서 다루는 Trace Channel 과 동일하다
따라서 프로젝트 세팅에서 필요한 Trace Channel을 설정 후 추가할 수 있다
Trace Shape
Trace함수를 사용할 때의 Trace와 동일하다
LineTrace를 할건지, BoxTrace, SphereTrace, CapsuleTrace를 할 건지 선택할 수 있다
Only Blocking Hit
체크하면 Blocking Hit 만 봄, 해제하면 Overlapped(겹침)까지 보는 것을 의미한다
Bool 일치
체크하면 가려지는 공간이 1
해제하면 보이는 공간이 1
Scoring Factor
가중치, Score에 곱해져서 계산된다
Querior를 기준으로 보이는 공간은 0, 보이지 않는 공간은 1이 되어 결과로 나왔다
Dot
Dot은 내적이다
따라서 두가지의 벡터(Line A, Line B)를 제공해야한다
Line A -> Rotation
Querier의 전방 방향이 된다
Line B -> Two Points
벡터를 그리듯이 시작지점과 끝 지점을 설정해주면 된다
Absolute Value
(-1 ~ 1)범위의 절댓값으로 (1 ~ 0 ~ 1)로 나온다
이렇게 EQS를 사용하면 AI를 만들 때 공간에 대한 정보를 쉽게 제공받을 수 있다
'> Study > Unreal Engine 4' 카테고리의 다른 글
[Plugin] Console Command (0) | 2024.04.12 |
---|---|
[Plugin] Debugging (0) | 2024.04.11 |
[Unreal C++] Component Overlap, Delgate, Trigger (0) | 2023.07.14 |
[Unreal C++] Player, Animation, Delgate (0) | 2023.07.06 |
[Unreal C++] Spawn, Log, TSubClassOf (0) | 2023.06.22 |