언리얼 엔진

UE5) 적,NPC 공격 기능 인공지능 추가

zzugest1 2025. 5. 9. 20:57

https://zzugest1.tistory.com/75

 

UE5) 적, NPC 인공지능 시스템

게임을 제작할 때 플레이어 외 여러 몹들을 생성해 이들과 상호작용는 것을 목표로 제작할 수 있는데, 이 때 적이나 NPC들이 어떻게 행동할지 정해주는 인공지능(AI) 시스템을 언리얼 엔진의 비헤

zzugest1.tistory.com

 

언리얼 엔진의 비헤이비어 트리와 블랙보드를 이용해 적이 플레이어 캐릭터를 추격하는 기능을 구현해보았다. 여기서 플레이어를 추격 후 일정거리에 도달하면 플레이어를 공격하도록 기능을 추가해볼 것이다.

 

비헤이비어 트리의 노드 종류 중 하나인 Task 노드는 AI가 수행할 가장 기본적인 동작을 담은 노드인데 이 Task 노드를 블루프린트 클래스로 직접 만들 수 있다.

 

콘텐츠 드로어에서 우클릭 후 블루프린트 클래스 파일을 하나 생성해준다.

 

 

task를 검색해 BT 테스크 블루프린트 베이스를 선택해 생성해준다.

 

 

생성한 테스크 블루프린트 파일의 왼쪽 함수의 오버라이드를 클릭해 ReceiveExcuteAI함수를 생성해준다. 여기서 ReceiveExcuteAI 함수는 AI가 이 테스크를 실행하면 자동으로 호출해주는 함수이다.

 

 

그 다음 이벤트 그래프를 위와 같이 만들어준다. 해석해보면 적 클래스(BP_Enemy)를 행변환해 가져와 몽타주 애니메이션을 실행하라(여기선 공격 모션)라는 뜻이다. 오른쪽 Finish Excute는 이 테스크가 실행 성공했다는것을 체크해주는 함수이다. 몽타주 애니메이션이 재생되었다면(On Completed) 이 테스크가 성공해 다음 노드로 넘어가라는 뜻이고, 실패했다면(On interrupted) 테스크가 끝나지 않았다는 뜻이다.

 

이렇게 공격 애니메이션을 재생하기 위한 테스크 노드를 만들었다면 비헤이비어 트리에서 추가를 할 수 있다.

 

 

컴포짓 노드에서 드래그 후 Tasks 노드에 위에서 만든 테스크 노드 파일(BTT_Attack)을 추가할 수 있다.

 

 

이렇게 노드를 추가하면 테스크 노드 오른쪽 위 숫자가 생기는데 왼쪽 BTT_Attack노드는 1, Move to 노드는 2라고 적혀있다. 

 

비헤이비어 트리는 기본적으로 노드의 왼쪽부터 차례로 실행을 하는 특징이 있다. 하지만 컴포짓 노드별로 조금씩 다른데 위의 경우인 Selector 노드는 가장 왼쪽 자식 테스크 노드가 성공하면 더 이상 자식 노드들을 실행하지 않는다.

따라서 위 사진의 경우는 적이 가만히 서서 공격 애니메이션을 실행하고 움직이지 않는다.

 

이 문제를 해결하기 위해 BTT_Attack 노드에 플레이어와 가까워 진 경우에만 실행하도록 조건을 추가해야 한다. 이를 위해 데코레이터(Decorator) 기능을 이용할 수 있다.

 

 

조건을 추가하고자 하는 테스크 노드를 우클릭 후 데코레이터 추가를 클릭하면 여러 조건들을 추가 할 수 있다. 여기서 플레이어와의 거리를 공격 조건으로 만들고자 한다면 Is At Location을 클릭한다.

 

 

Is At Location 데코레이터를 클릭 후 블랙보드 키를 Player로 바꿔준다. 이렇게 하면 Player키를 가진 대상이 허용 가능 변경내에 들어오면 공격 애니메이션을 실행하라라는 뜻이 된다. 그리고 허용 가능 반경을 벗어난다면 BTT_Attack노드는 테스크 실행 실패가 되므로 Selector노드의 특성 상 다음 노드인 Move to로 넘어가 플레이어를 추격할 것이다.

 

 

 

위와 같이 플레이를 추격하고 플레이어와 가까이 있으면  공격하는 것을 볼 수 있다.

 

여러 노드들을 이용한 비헤이비어 트리 예시 모습

 

이렇게 언리얼 엔진 비헤이비어 트리를 이용해 적 클래스에 인공지능 기능을 부여해 여러 상황들을 만들어나갈 수 있다.