프로그래밍 공부
작성일
2024. 3. 15. 15:31
작성자
WDmil
728x90

언리얼에서 사용하는 AI 설계에 대한 기초 개념을 알아보자.


AI_Controller

 

AI의 기본 이동에 대해 개념을 불어넣는 컨트롤러 이다.

 

원래 Player가 컨트롤하는 것은 PlayerController가 붙고, 컴퓨터가 컨트롤하는것은 AI_Controller가 붙는다고 이해하면 된다.

블루프린트 에서 AIController로 생성하면 된다.

 

 

생성 초기 화면이다. 따로 컴포넌트는 추가하지 않으나, 사용하는 컴포넌트로는 보통 AIPerception을 사용한다.

에서 사용하고, AIPerception컴포넌트를 이용하는데, 이 퍼셉션은 탐색을 의미한다.

지정된 AI 퍼셉션 알고리즘을 통해, 지정된 방식대로 객체를 탐색하게 된다.

 

Senes Config는 지정된 탐색 알고리즘을 의미하고, Domination Sense는 알고리즘 탐색을 수행하다가 중간에 추가 이벤트가 발생하였을 경우, 지정된 이벤트를 더 우선시 한다는 의미이다.

 

즉, 탐색을 진행하다가 도미네이션에 Damage관련 이벤트를 기입하였을 때, 데미지가 발생하면 AI 퍼셉션은 데미지 처리를 더 우선한다는 의미.

 

 

이러한 퍼셉션은 위와같은 데이터 처리가 발생하는데, 반환값은 배열이다.

 

위 블루프린트 코드는, 배열값을 확인해서 탐지된 Actor중 Player를 찾아내고, 찾았다면, 찾았다는 Bool표시를 True로, 한 뒤, Break를 커스텀이벤트로 실행시킨다.

 

실행되었다면, 블랙보드를 가져와서, 블랙보드의 데이터에 값을 기입하게 된다.


AI_Controller 요약

쉽게 이해하면, 우리가 손으로 만지는 키보드, 마우스의 행동을, 지정된 if문으로 수행하기 위해 사전데이터를 준비한다고 생각하자. 위 AI_Controller는 부모객체가 되어, 자식객체에서 탐색코드를 따로 정의하지 않고 공통으로 사용할 수 있도록 만들어놓은 것이다.

 


Behavior Tree

https://docs.unrealengine.com/5.0/ko/behavior-trees-in-unreal-engine/

 

비헤이비어 트리

언리얼 엔진의 비헤이비어 트리 에셋을 설명하고 이를 활용하여 프로젝트의 NPC를 위한 인공 지능(AI)을 생성하는 방법을 알아봅니다.

docs.unrealengine.com

 

겉보기에는 조금 복잡해보이지만, 쉽게 이해할 수 있다.

각 신경망처럼 노드와 저장공간인 블랙보드 로 이루어지는데,

 

먼저, 위에 있는 노드들의 종류에 대해 알아보자.

 

각 노드의 기본은 컴포짓. 으로 구분되며,

 

테스크, 데코레이터, 서비스 의 3가지로 이루어질 수 있고, 각 객체는 여러개가 동시에 검사될 수 있다.

 


컴포짓(Composite)

위 이미지의 사각형에 해당하는 큰 틀을 의미한다.

노드라고 이해하면 되며, 테스크, 데코레이터, 서비스가 들어가서 동작사항을 구분지어줄 수 있다.

 

기본으로 3가지로 구분되며, Sequence, Selector, Simple Parallel이 있다.


시퀸스(Sequence)

리턴값이 False라면, 현재 동작사항을 종료한다고 설정하는 것이다.

지정된 행동의 리턴값을 판별해서, 리턴값이 False가 되면 넘긴다

 

쉽게 설명하면, 이동하다가, 이동할 수 없는 어떠한 경우가 생긴다면, False가 반환되고, 이동 시퀸스가 종료되는 식이다.


셀렉터(Selector)

리턴값이 True가 되면 현재 동작사항을 종료한다고 설정하는 것이다.

지정된 행동의 리턴값을 판별해서, 리턴값이 True가 되면 넘긴다

 

쉽게 설명하면, 일정 구간을 계속 탐색하다가, 적을 발견하면 True를 반환하고 종료하는 식이다.


단순 병렬(Simple Parallel)

내부의 자손을 두개 가지고, 각 자손을 A와 B라고 할 때, A를 수행하는 중, B를 같이 수행한다고 생각하면 된다.

 

쉽게 이해하면, 적을 향해 이동하면서 적을 공격하는것 이다.


테스크(Task)

테스크는 그대로 이해하면 된다. 동작사항을 말하는 것으로 반환값으로 보통 Bool값을 반환한다.

 

지정된 함수포인터 또는 블랙보드의 저장된 데이터를 참고해서 동작을 수행한다.

 

위 이미지에서, Move To라고 있다면, 지정된 동작은 블랙보드의 SelfActor에 대해 일정한 방향으로 이동동작을 수행시키는것. 이라고 생각하면 된다.

 

쉽게 말하면. 행동이고, 반환값으로는 없어도 무방하나, 보통 성공 실패 두가지로 Bool값을 리턴한다.


데코레이터

노드에서 데이터가 재생될 때, 조건문을 추가한다고 생각하면 된다.

 

예를들어, BlackBorard에서 데이터를 참조한다고 하자.

데이터의 블랙보드에서, IsSet으로 Player가 지정되어있을 경우, 에만 Player가 NULLPTR이 아닐경우에만 밑의 MoveTo를 실행한다.


서비스(Service)

데코레이터를 좀 더 다채롭게 구성하는걸 이야기한다. 내부의 조건문 동안. 어떠한 컴포넌트를 실행할 수 있도록 조정할 수 있는, 종합적인 데이터 관리체계라고 생각하면 된다.

위와같이, Service를 처리해서, 현재 객체의 상태값을 확인하고, 어떠한 상태라면 어떠한 행동을 하도록 행동을 수정해주는 역할이다.

 

즉, 플레이어가 어떠한 주체적인 행동을 하듯 AI가 어떤 주체적인 행동을 하도록 해주는 것이다.


Black Board

 

블렉보드는 쉽게 이야기하면, 저장공간을 말한다.

AI가 행동하면서 확인하거나 데이터의 목록을 수정,설정하게 되는데, 여기에 들어가는 데이터들을 블랙보드에 몰아넣는다.


인바이런먼트 쿼리 시스템(EQS)

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

 

인바이런먼트 쿼리 시스템

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

docs.unrealengine.com

환경 데이터를 수집하는 AI툴이다.

어떠한 위치를 기준으로 정사각형 배열의 Point를 생성하고, 해당 포인트에 어떠한 값이 지정되는지를 설정하고 정하는 역할을 한다.

 

이 인바이런먼트 쿼리 시스템을 활용해서 주변환경 또는 지정된 위치 주변 환경을 탐색하고, 접근이 가능한지 등을 확인할 수 있다.

이러한 EQS는 지정된 위치 기준으로 데이터를 설정하고, 설정된 데이터를 기준으로 Point를 전개, 그리고 전개된 Point는 어떠한 함수에 의해서 값이 정해진다.

 

그리고 Result로 임의의 가장 높은 Point를 정하고. 해당 위치로 이동하게 된다.

이런식으로 위치값을 참조하고, 가능한 위치로 이동&행동을 진행하게 유도할 수 있다.

728x90