인바이런먼트 쿼리 시스템 사용 안내서

이 문서는 비헤이비어 트리 내 인바이런먼트 쿼리 시스템의 인터페이스와 가장 자주 쓰이는 작업방식에 대해 다룹니다.

Windows
MacOS
Linux

인바이런먼트 쿼리 시스템 활성화

  1. 편집 메뉴 -> 에디터 개인설정

  2. 실험단계 기능

  3. AI 섹션을 찾습니다.

  4. Environment Query System 를 활성화합니다.

인바이런먼트 쿼리의 부속

인바이런먼트 쿼리란 실제로 여러가지 부속으로 이루어집니다. 비헤이비어 트리에서 인바이런먼트 쿼리를 호출하고 나면, 실제 인바이런먼트 쿼리는 그 제너레이터를 사용하고, 컨텍스트를 참조한 뒤, 그 테스트를 사용하여 비헤이비어 트리에 최고 가중치 결과를 냅니다.

비헤이비어 트리

비헤이비어 트리에 인바이런먼트 쿼리를 사용하려면, Run EQS Query 태스크 노드가 필요합니다.

runEQS.png

비헤이비어 트리에서 선택해 보면, (인바이런먼트 쿼리 애셋인) Query Template 프로퍼티 설정, (인바이런먼트 쿼리 애셋에 전달되는 네임드 값인) Query Params 프로퍼티 설정, 어느 블랙보드 키에 (오브젝트 또는 벡터) 최고 가중치 결과를 반환할지를 설정할 수 있습니다.

runEQS_details.png

비헤이비어 트리 문서에서 사용법 관련 상세 정보를 참고해 보시기 바랍니다.

인바이런먼트 쿼리

인바이런먼트 쿼리 애셋은 비헤이비어 트리에서 Run EQS Query 노드를 사용하여 호출하는 것으로, 다수의 액터 또는 위치 중 "최적의" 것을 찾기 위해 테스트하는 것입니다. "최적" 이라는 것으로 정의되는 것은, 정말이지 테스트가 인바이런먼트 쿼리에 구조화되는 방식에 달려 있습니다.

인바이런먼트 쿼리 는 블루프린트 및 C++ 에서 생성 가능합니다.

제너레이터

Generator (생성기)는 Item (아이템)이라고도 하는 위치 또는 액터를 생성하며, 실제로 이에 대해 테스트 및 가중치를 계산하여, 최고 가중치의 위치 또는 액터가 비헤이비어 트리에 반환되게 됩니다.

제너레이터 는 블루프린트 및 C++ 에서 생성 가능합니다.

컨텍스트

컨텍스트는 다양한 테스트와 제너레이터에 대한 레퍼런스 프레임입니다. 쿼리어 (질의자) 처럼 간단할 수도, 한 유형의 모든 액터 처럼 보다 복잡할 수도 있습니다.

참고할 만한 사실이라면, 심플 그리드 제너레이터같은 제너레이터는 다수의 위치 또는 액터를 반환하는 컨텍스트를 사용할 수 있다는 점입니다. 그러면 정의된 크기와 밀도의 심플 그리드가 각 컨텍스트 위치에 생성됩니다.

컨텍스트 는 블루프린트와 C++ 에서 생성 가능합니다.

테스트

테스트는 인바이런먼트 쿼리가 제너레이터의 어느 아이템이 "최적"인지 결정하는 방식입니다. 기본 테스트로 일반적인 용례는 대부분 해결됩니다. 이를테면 아이템이 다른 위치로 트레이스 가능한가, 또는 아이템과 컨텍스트의 거리가 지정된 범위 이내인가 식입니다.

현재 테스트 는 C++ 에서 생성해야 합니다. 블루프린트 버전의 구현은 없습니다.

쿼리 만들기

newQuery.png

  1. 콘텐츠 브라우저에서 생성 버튼에 좌클릭 합니다.

  2. 기타 -> 인바이런먼트 쿼리 를 선택합니다.

블루프린트 컨텍스트 만들기

  1. 콘텐츠 브라우저에서 생성 버튼에 좌클릭 합니다.

  2. 블루프린트 를 선택합니다.

  3. 모든 클래스 를 펼칩니다.

  4. EnvQueryContext 를 검색합니다.

  5. EnvQueryContext_BlueprintBase 를 선택합니다.

블루프린트 제너레이터 만들기

  1. 콘텐츠 브라우저에서 생성 버튼에 좌클릭합니다.

  2. 블루프린트 를 선택합니다.

  3. 모든 클래스 를 펼칩니다.

  4. EnvQueryGenerator 를 검색합니다.

  5. EnvQueryGenerator_BlueprintBase 를 선택합니다.

루트를 제너레이터에 연결하기

connectRootToGen.png

루트 노드 하단의 짙은색 바를 좌클릭으로 끌어 제너레이터 노드 상단의 짙은색 바에 놓으면 연결됩니다.

다른 방법으로는, 그래프 영역에 좌클릭하여 끌어 놓으면, 제너레이터 노드를 새로 생성하는 옵션이 나옵니다.

루트에 하나 이상의 제너레이터를 연결할 수는 있지만, 가장 왼쪽의 유효한 제너레이터만이 쿼리에 사용됩니다.

비헤이비어 트리에 쿼리 추가하기

비헤이비어 트리에 인바이런먼트 쿼리를 사용하려면, Run EQS Query 태스크 노드가 필요합니다.

runEQS.png

  1. 비헤이비어 트리 그래프 영역에 우클릭합니다.

  2. 태스크 -> Run EQS Query 노드를 생성합니다.

  3. 새로 생성된 Run EQS Query 노드를 선택하고, Query Template 프로퍼티를 우리 인바이런먼트 쿼리 애셋으로 변경합니다 (아니면 풀다운 메뉴에서 하나 새로 만들어도 됩니다).

  4. 옵션으로, 인바이런먼트 쿼리가 찾고자 하는 Query Params 를 몇이든 설정합니다.

  5. 마지막으로, 인바이런먼트 쿼리가 설정할 블랙보드 키를 설정합니다. 여기서는 오브젝트 및 벡터 블랙보드 키만 사용 가능합니다.

쿼리 편집하기

제너레이터 추가하기

  1. 쿼리의 그래프 영역에 우클릭한 다음, 제너레이터를 선택합니다.

addGenToQuery.png

테스트 추가하기

  1. 제너레이터에 우클릭한 다음 추가할 테스트를 선택합니다.

addTest.png

테스트 변경하기

  1. 제너레이터의 테스트를 선택한 다음 디테일 패널에서 변경합니다.

editTest.png

각각의 테스트에 대한 사용법 정보는 인바이런먼트 쿼리 시스템 노드 레퍼런스 문서를 참고하세요.

쿼리 결과 미리보기

쿼리의 결과를 미리보는 방법에 대한 정보는 EQS 테스팅 폰 문서를 참고하세요.

testingPawnBanner.png

컨텍스트 편집하기

새로 생성된 EnvQueryContext 블루프린트에는 구현가능한 함수가 넷 있을 것입니다:

  • Provide Single Location 단일 위치 제공

  • Provide Single Actor 단일 액터 제공

  • Provide Locations Set 위치 세트 제공

  • Provide Actors Set 액터 세트 제공

이들 중 하나 이상을 구현하면, 쿼리의 테스트 안에서 사용할 수 있는 별도의 커스텀 컨텍스트를 만들 수 있습니다. 함수 또는 구현하고자 하는 함수에 우클릭한 다음 Implement Function (함수 구현)을 선택하세요.

implementableFunctions.png

단일 위치 제공

단일 위치(벡터)를 반환합니다. 그 위치 생성 방법은 여러분에게 달렸습니다. 예를 들어, 이 함수는 쿼리어(질의자) 1500 cm 내에서 찾은 임의 (Pawn, Vehicle 등 DesiredObjectType 배열에서 찾을 수 있는 유형 중 하나인) 액터의 트레이스 히트 위치를 반환합니다:

단일 액터 제공

단일 액터를 반환합니다. 그 액터를 찾는 방법은 여러분에게 달렸습니다. 이 예제에서는, 함수가 플레이어 0 이 제어하는(빙의한) 액터를 반환합니다:

위치 세트 제공

위치 배열(벡터)을 반환합니다. 이 위치 생성 방법은 여러분에게 달렸습니다. 이 예제 그래프는 반경이 1500 유닛인 원의 간격이 고른 16 개 지점에서 트레이스를 하여, 환경에 성공적인 히트를 반환합니다:

액터 세트 제공

액터 배열을 반환합니다. 이 액터를 찾는 방법은 여러분에게 달렸습니다. 예를 들어 이 함수는 1 로 설정된 Team Number 변수가 있는 MyCharacter 액터 배열을 반환합니다:

제너레이터 편집하기

Event Do Item Generation

implementDoItem.png

제너레이터에 대한 주요 함수입니다. 이 함수를 구현하면, 인바이런먼트 쿼리에서 전달되어 들어오는 컨텍스트 위치인 위치 배열을 구하게 됩니다. 컨텍스트에 따라서, 이는 그냥 쿼리어(질의자) 위치 항목 하나로 된 배열일 수도 있고, 레벨에 있는 모든 헬쓰 팩 위치가 될 수도 있습니다.

Add Generated Actor

AddGenActor.png

함수는 하나의 값만을 반환할 수 있지만, 편리하게도 "Do Item Generation" 함수는 인바이런먼트 쿼리에 사실상 두 개의 배열을 전달할 수 있습니다. 이 노드는 액터 반환 배열에 액터를 추가해 주며, Add Generated Vector 와 함께 사용하여 위치 값을 반환하도록도 할 수 있습니다.

제너레이터가 비헤이비어 트리에 실제로 무엇을 전달할지 결정하는 방식은 EnvQuery 노드에서 어떤 블랙보드 키를 설정하고 있는지에 따라 달라집니다.

Add Generated Vector

AddGenVec.png

함수는 하나의 값만을 반환할 수 있지만, 편리하게도 "Do Item Generation" 함수는 인바이런먼트 쿼리에 사실상 두 개의 배열을 전달할 수 있습니다. 이 노드는 벡터 반환 배열에 벡터를 추가해 주며, Add Generated Actor 노드와 함께 사용하여 액터 값을 반환하도록도 할 수 있습니다.

제너레이터가 비헤이비어 트리에 실제로 무엇을 전달할지 결정하는 방식은 EnvQuery 노드에서 어떤 블랙보드 키를 설정하고 있는지에 따라 달라집니다.

예제 제너레이터

반경이 Rad 인 원의 에지에서 쿼리어(질의자) 쪽으로 트레이스합니다. 각 트레이스 사이 간격은 Number of Spokes 값에 따라 일정 각도가 (360 / Number of Spokes 가) 되도록 합니다. 트레이스 위치는 환경에 맞았을 때만 저장하여, 본질적으로 호출하는 것을 볼 수 없는 표면을 찾는 것입니다.

결국 이러한 모습입니다:

customGenOutput.png

이 예제에서 해야 할 한 가지는, Do Item Generation 에서 전달받은 Context Locations 를 사용하여 원 생성 위치를 변경하는 것입니다. 이미지 크기 제한때문에 하지 못했을 뿐입니다.

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼