AI 기초
1. Unreal Engine AI 개요
인터랙티브 경험의 핵심 요소인 Unreal Engine AI
게임 등 엔터테인먼트 콘텐츠가 재미있는 이유 중 하나는 인터랙션이다. 게임 속 몬스터를 따돌리고 컨트롤을 이용해서 강력한 상대를 무찌르는 등 게임 속의 룰/오브젝트와 상호작용하며 목표를 달성해내는게 게임의 주요 재미다.
몬스터나 NPC, 맵 내의 액터들이 플레이어가 나타나면 기다렸다는듯 인지하고 공격하는 등 액터가 마치 지능이 있는 것처럼 행동하도록 설계하는 기능을 언리얼 엔진의 “인공지능”이라고 한다.
2. Unreal Engine AI 구현
Unreal Engine AI는 아래와 같은 3가지 오브젝트로 구성된다.
- 우리 뇌-신경처럼 게임속 AI 액터를 찾아서 움직이도록 조작하는 AI Controller
- 어떤 상황에 무슨 행동을 할지 등 상황 판단 행동 규약(알고리즘)을 저장하는 Behavior Tree
- 뇌처럼 AI가 해야 할 일 등의 정보와 키(Key) 등을 기억(저장)하는 Blackboard
보통 Behavior Tree와 Blackboard는 에디터에서 생성하고, AIController를 cpp 클래스로 선언해서 사용한다.
- Behavior Tree는 행동규약, 또는 양식을 미리 지정해두는 오브젝트다. 어떻게 움직일지 약속을 미리 정리해두는 것으로 알고리즘, 의사결정나무 혹은 사다리타기 게임과 유사한 로직
- Blackboard는 AIController와 Behavior Tree 사이에서 AI의 의사결정에 필요한 정보를 주고받도록 도와주는 데이터 저장소다. 공공기관-국민으로 비유하자면 주요 공지사항을 공시하는 게시판 같은 역할이다. 접수 예정인지, 접수중인지, 마감되었는지 표시하여 의사결정에 영향을 미치는 것
AI의 이동범위를 지정하는 네비게이션 메시 설정
1. NavMeshBoundsVolume
NavMeshBoundsVolume은 AI가 이동할 수 있는 영역을 정의하는 볼륨이다.
네비메시를 레벨에 배치하면 그 영역 내에서 내비게이션 메시가 자동으로 생성되어 AI가 그 안에서만 이동할 수 있게 된다. 이를 활용해 AI 행동 설계의 외부적 요인으로 사용할 수 있다.
2. NavMeshBoundsVolume의 동적생성
1) 동적으로 NavMeshBoundsVolume 생성 세팅
네비메시는 C++을 활용하여 플레이 도중에 동적으로 재계산할 수도 있다. 게임중 네비메시의 영역내 오브젝트의 높이, 각도 등이 변하는 경우 사용되는 기능이다.
- 동적(Dynamic) 생성이란 게임 플레이 도중에 네비메시 구역이 추가되거나 삭제된다는 뜻
- 한 번 세팅하면 그대로만 적용되는 “정적” 네비메시 생성과 달리 동적 생성의 경우는 플레이 도중 생성되므로 조금 더 복잡한 게임을 디자인 할 때 유용하게 사용된다.
- 예) 게임중 레벨의 지형지물이 뒤틀리는 경우 등에 사용할 수 있다
- 네비메시의 동적 생성기능은 리소스를 많이 소모하는 기능이다
2) Runtime Setting
Dynamic으로 설정
각 생성 모드별 설명
Static | - 내비게이션 메시가 오프라인(레벨 디자인 시)에 생성되어 레벨과 함께 저장됨 - 런타임에는 단순히 로드되며, 메시가 변경되지 않음 |
Dynamic | - 내비게이션 메시가 오프라인에서 생성되어 저장되거나, 런타임에 새로 생성될 수 있음 - 런타임 중 내비게이션 관련 데이터가 변경되면, 변경된 타일에서 메시가 재생성되어 업데이트됨 |
Dynamic Modifiers Only | - 내비게이션 메시는 오프라인에서 생성되어 레벨과 함께 저장됨 - 런타임에서는 내비게이션 영역, 링크, 동적 오브젝트 등과 같이 메시의 일부만 수정하여 업데이트함 - 새로운 메시 표면은 생성되지 않으며, 콜리전 데이터 캐시를 통해 타일 처리 비용을 최대 50% 절감 - 장단점을 신중히 고려 후 사용해야 함 |
자료: 언리얼 엔진 네비게이션 메시 공식 문서
Runtime Generation이 Static일 경우
- NavMeshBoundsVolume은 아래와 같이 플레이 도중에 생긴 새로운 변화를 무시
Runtime Generation이 Dynamic일 경우
- 아래와 같이 변화에 대응하여 동적으로 메시를 생성
Runtime Generation이 Dynamic Modifier 일 경우
- Dynamic Modifier는 Static과 Dynamic옵션을 섞은 것과 동일. 다만 Dynamic Modifier는 네비매시 영역에서 “빼기”만 가능하다는 점이 핵심 차이점
주의할 점 : Dynamic Modifier 의 경우 액터 내에 NaviModifierVolume이 존재해야 Dynamic Modifier기능대로 작동한다는 것
3) NavMeshBoundsVolume 동적생성 예제 구현
NavMeshBoundsVolume는 Scale이 아니라 Brush 크기를 활용해 레벨 내 적용되는 지오메트리를 결정한다. 그런데 언리얼 엔진의 아키텍쳐 특성상 Brush는 런타임 중 동적 재생성이 불가능하다.
설계 상의 이유로 게임을 플레이하는 도중에 NavMeshBoundsVolume을 새로 생성하여 레벨 내 네비메시 적용범위를 늘리거나 줄이는 방식의 구현은 어렵다는 것이다.
이러한 문제점을 고려해 언리얼 엔진은 Navigation Invoker라는 기능을 제공한다. Navigation Invoker는 Navigation Invoker라는 컴포넌트를 가진 액터의 주변 영역만 연산해서 리소스를 아끼고, 게임 플레이는 문제없이 가능하게 하는 기능이다.
헤더파일에 NavigationInvokerComponent.h와 Invoker를 추가
#include "NavigationInvokerComponent.h"
// Invoker 세팅
UPROPERTY(BlueprintReadWrite, Category = Navigation, meta = (AllowPrivateAccess = "true"))
UNavigationInvokerComponent* NavInvoker;
/** 네비게이션 메시 생성 반경 */
float NavGenerationRadius;
/** 네비게이션 메시 제거 반경 */
float NavRemovalRadius;
/** Returns NavInvoker subobject **/
FORCEINLINE class UNavigationInvokerComponent* GetNavInvoker() const { return NavInvoker; }
소스 코드 생성자에 구체적인 InvokerComponent 관련 기능 구현
// 활성화될 범위 설정
NavGenerationRadius = 10.0f;
NavRemovalRadius = 15.0f;
// Navigation Invoker 컴포넌트 생성 및 초기값 셋업.
NavInvoker = CreateDefaultSubobject<UNavigationInvokerComponent>(TEXT("NavInvoker"));
// SetGenerationRadii 함수를 사용하여 생성 반경과 제거 반경 설정. Protected 멤버변수이므로 함수를 통해 수정 필요.
NavInvoker->SetGenerationRadii(NavGenerationRadius, NavRemovalRadius);
빌드파일에 “NavigationSystem” 모듈을 작성
PublicDependencyModuleNames.AddRange(new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EnhancedInput",
"NavigationSystem" // 여기 NavigationSystem 모듈 추가!
});
Runtime Generation → Dynamic으로 수정
Generate Navigation only Around Navigation Invokers → True로 수정
레벨 내 세팅 후 테스트 한 결과, 목표한 대로 BP_AINPC의 주변만 네비메시가 활성화 되는 모습이 확인된다.
'내일배움캠프 > TIL' 카테고리의 다른 글
[내일배움캠프 Day87] AI - 애니메이션, 사운드 (0) | 2025.04.23 |
---|---|
[내일배움캠프 Day86] AI - 회피, 자동 네비게이션 링크 (0) | 2025.04.22 |
[내일배움캠프 Day75] 1주차 멀티플레이 팀플 (0) | 2025.04.07 |
[내일배움캠프 Day59] 숫자 야구 게임 과제 (2) | 2025.03.14 |
[내일배움캠프 Day58] 채팅 따라하기 (0) | 2025.03.13 |