🎮Unreal4/Blueprint

[UE4] Enemy AI -1 : 감지기능 (AIController, AIPerception, 디버그모드, On Possess, 내비게이션 메시, Task)

공대 컴린이 2023. 2. 22. 01:08
728x90

AIController와 비헤이비어 트리, 블랙보드를 이용한 Enemy AI 기능을 하나씩 구현해보았다.

가장 먼저 언리얼의 막강한 기능인 "감지" 기능을 구현해보았다.

🔦 감지 기능

AIController를 상속받아 생성한 블루프린트 클래스에서, AIPerception 컴포넌트를 추가한 뒤, 디테일 패널의 AI Perception 값들을 수정하면 감지 기능을 구현할 수 있다.

 

  • AI Damage sense config 
    - AI가 데미지를 받는 순간 데미지를 준 객체를 감지하기 시작한다.
    - Apply Damage로 데미지 주면 사용 가능하다.
  • AI Hearing config
    - 소리가 들리면 감지하기 시작한다.
    - 이때 소리는 mp3, wav 파일같은 사운드를 듣는것이 아니라 Make Noise 함수를 이용한 노이즈를 듣는다.
  • AI Prediction sense config
    - AI와 객체가 겹칠 때, 즉 Overlap 되었을 때 감지가 시작된다.
  • AI Sight config
    - AI의 시야에 들어왔을 때 감지가 시작된다.
  • AI Team sense config
    - AI들이 같은 팀간의 간격이나 위치를 감지해서 움직일 때 사용된다.
    - 예를들어, 말들이 알아서 움직이는것 같은 군집 AI를 구현할 때에도 사용된다.
  • AI Touch config
    - AI와 객체가 닿을 때(Block 충돌) 감지가 시작된다.
  • Dominant Sense
    - 감지 방법을 여러가지로 설정할 수 있는데, 어떤 감지를 우선순위로 둘 것인지 설정하는 속성
  • Detection by Affiliation
    - Detect Enemis : 적을 감지한다.
    - Detect Neutral : 중립, 전부 감지한다.
    - Detect Friendies : 아군을 감지한다.
  • 최대 수명
    - 설정한 수명이 다하면 감지를 잃는다.
    - 0이면 계속 잃지 않고 감지를 유지한다.

🔎 디버그 모드

게임을 플레이시키고, 플레이어에 빙의되어 있는 상태에서 " ' (세미콜론 오른쪽) " 키를 누르면 디버그 모드가 시작된다.

디버그 모드에서 AI의 상태와 비헤이비어 트리의 상태를 실시간으로 확인할 수 있고, 숫자패드 4번을 누르면 AI의 감지 범위가 출력된다.


AI Controller의 AIPerception 컴포넌트 초기화가 모두 끝나면 본격적으로 감지를 시작하는 블루프린트를 작성해보았다.

 

BP_AIController_Basic : 이벤트 그래프

먼저, On Possess 이벤트를 호출하여 컨트롤러가 폰에 빙의한 순간 빙의된 폰을 BP_Enemy_AI로 형변환하여 Enemy AI 변수에 저장해두었다.

Enemy_AI 블루프린트에는 Behavior Tree를 변수로 생성해두었기 때문에, Run Behavior Tree함수를 통해 비헤이비어 트리를 시작해주었다.

 

On Perception Updated 함수는 AI Perception 컴포넌트에서 감지된 순간 호출되며 감지된 액터를 반환해준다.

이때, 반환되는 감지된 액터들이 누적으로 나오기 때문에 별도의 함수를 만들어 호출해주었다.

 

BP_AIController_Basic : Perception Updated

AIPerception 컴포넌트의 Get Currently Perceived Actors 함수를 사용하면 현재 감지된 액터를 반환한다.

Sense to Use 설정은 어떤 방식으로 감지된 액터를 가져올 것인지를 설정하는 부분인데 None으로 해두면 모든 방식으로 감지된 액터를 반환해준다.

 

이렇게 반환된 액터들이 BP_Player에 형변환 된다면, Player를 감지한것이므로 블랙보드에 Target 키(Key)에 감지한 Player 액터를 저장해주었다.

 

AI Controller의 이벤트 그래프에서 Behavior Tree를 실행하면서 Run 함수를 호출하면, 해당 Behavior Tree에 연결된 블랙보드를 자기자신(AI Controller)에 셋팅해놓기 때문에 Get Blackboard 같은 함수를 통해 Controller에서도 블랙보드를 호출해 사용할 수있다.

 

for문이 다 돌아서 Completed 될 때까지 함수가 반환되지 않았다면 액터를 감지하지 못했다는 뜻이므로 Object Value를 None으로 설정한 Target 초기화를 진행해주었다.

🚗 내비게이션 메시 (Navigation Mesh)

이후, AI가 움직일 공간인 내비 메시 바운드 볼륨을 뷰포트에 배치한 뒤, 크기와 위치를 지정해주었다.

 

언리얼 엔진에서 내비게이션 시스템은 인공지능 에이전트에게 경로 탐색 기능을 제공한다.

시작 위치와 목적지 사이의 경로를 찾기 위해 내비게이션 메시가 월드 콜리전 지오메트리에서 생성된다.

 

이후, 비헤이비어 트리에서 데코레이터 Blackboard를 추가하여, 블랙보드에 있는 Key, Target을 변수로 사용할 수 있도록 한 뒤, Target이 Set 되면 수행하도록 조건문을 걸어주었다.

 

또한 Task에는 성공, 실패, 중단 세 가지 상태가 존재하여 Task의 수행 도중 중단을 시킬수도 있다.

 

이렇게 만들어진 AI를 실행시키면, Enemy AI의 시야 안에 플레이어가 감지되면 Target이 Set되어 Move To 태스크가 실행되고, 시야로부터 벗어나면 Wait 태스트 실행 후 벗어나는 구조가 완성되었다.

 


참조

https://docs.unrealengine.com/5.0/ko/overview-of-how-to-modify-the-navigation-mesh-in-unreal-engine/

 

내비게이션 메시 수정하기

이 가이드에서는 언리얼 엔진에서 내비게이션 메시를 수정하는 방법을 설명합니다.

docs.unrealengine.com

 

728x90