NavMeshBoundsVolume
NavMeshBoundsVolume은 AI가 이동할 수 있는 영역을 정의하는 볼륨이다.
NavMeshBoundsVolume은 네비게이션 메시 시스템을 사용하는 모든 오브젝트의 이동 영역을 정의하는 장치로, 해당 볼륨 안에서만 네비메시를 생성하고, NavMeshBoundsVolume를 벗어나면 AI는 이동 불가상태가 된다.
배치한 후 키보드에 " R "키를 사용하여 NavMeshBoundsVolume에 크기를 조절해준다.
키보드에 " P "를 누르면 NavMesh가 초록색으로 시각화되어 보기 편해지면 AI가 이동 가능한 영역을 나타내 준다.
NavMeshBoundsVolume 동적 생성 (RunTime Generation)
.NavMeshBoundsVolume은 기본적으로 정적(static)이지만 게임 플레이 도중 NavMesh를 동적으로 재계산 할 수 있다. 게임 플레이 중 영역내 오브젝트의 높이, 각도 등이 변하는 경우에 사용된다.
동적(Dynamic) 생성이란 게임 플레이 도중에 네비메시 구역이 추가되거나 삭제된다는 뜻이다.
한 번 세팅하면 그대로만 적용되는 “정적” 네비메시 생성과 달리 동적 생성의 경우는 플레이 도중 생성되므로 조금 더 복잡한 게임을 디자인 할 때 유용하게 사용된다.
예를들면 게임중 레벨의 지형지물이 뒤틀리는 경우 등에 사용할 수 있다.
Project Setting > Navigation Mesh > Runtime에 들어간 다음 Runtime Generation 옵션을 Dynamic으로 변경해준다.
기존에는 Runtime Generation이 Static인 기본으로 설정되어있다.
Runtime Generation에 생성 모드 설명
Static | - NavMesh가 오프라인으로 레벨 생성시 생성되어 레벨과 함께 저장된다. - 런타임에는 단순히 로드되며, NavMesh가 변경되지 않는다 |
Dynamic | - NevMesh가 오프라인에서 생성되어 저장되거나, 런타임에 새로 생성될 수 있다. - Runtime 중 NevMesh관련 데이터가 변경되면, 변경된 타일에서 메시가 재생성되어 업데이트가된다. |
Dynamic Modifiers Only |
- NevMesh는 오프라인에서 생성되어 레벨과 함께 저장된다. - Runtime에서 네비게이션 영역, 링크, 동적 오브젝트 등과 같이 메시의 일부분만 수정하여 업데이트한다. - 새로운 메시 표면은 생성되지 않고, 콜리전 데이터 캐시를 통해 타일 처리 비용을 최대 50% 절감해준다. |
왕복하는 액터로 Runtime Generation 설명
Static
NevMesh에 변화가 없다.
Dynamic
NevMesh영역이 동적으로 반영된다.
Dynamic Modifier Only
NevMesh영역이 Static과 Dynamic옵션을 섞은것처럼 동일하지만 NevMesh 내부 진입 후, 진입 영역만 동적으로 삭제되는 모습이다.
Dynamic Modifier Only시에 액터에 컴포넌트로 Nav Modifier을 추가해줘야한다.
액터 내에 NaviModifierVolume이 존재해야 Dynamic Modifer Only가 작동한다.
Runtime Generation 요약
- Static
- 레벨 내 동적 변화에 대응 불가. - Dynamic
- 런타임에서의 변화에 대응이 가능. - Dynamic Modifier Only
- 런타임에서 영역 추가를 제외한 부분 수정만 가능.
Navigation Invoker
Navigation Invoker를 사용한 액터나 AI(NPC, Enemy)에 Navigation Invoker의 크기만큼의 영역에서만 NavMesh를 동적으로 생성해 주는 기능이다.
이 기능은 레벨 전체에 NavMesh를 설정해뒀을 때 AI를 배치하면 AI가 모든 레벨을 돌아다니는 것을 방지하고, AI에 정해진 Navigation Invoker만큼의 크기만 돌아다니게 되며 AI가 10개를 배치하거나 100개를 배치하는 등 수많은 AI를 배치했을 때 정해진 Navigation Invoker에 영역만큼만 돌아다니게 되는 효과를 가져다 준다.
AI가 움직이면 Navigation Invoker도 따라서 같이 움직인다.
Navigation Invoker가 필요한 이유
- 레벨 전체에 NavMesh를 깔면 성능 낭비
- 큰 맵, 다수 AI가 있는 게임에서 최대 리소스 절약
- 필요한 구역만 NavMesh 생성하여 AI 경로 탐색 처리
Navigation Invoker 동작 방식
요쇼 | 설명 |
NavInvoker 위치 | 붙은 액터(NPC, 플레이어)의 현재 위치 중심 |
NavGenerationRadius | 주변 반경 내 NavMesh 생성 범위 |
NavRemovalRadius | 반경 밖의 NavMesh 제거 범위 |
Navigation Invoker 사용 방법
AICharacter 기준으로 설명을 하면 AICharacter 헤더파일에 아래 선언 코드를 추가한다.
#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; }
그리고 소스파일 헤더에 아래 코드를 추가한다.
#include "NavigationSystem/Public/NavigationInvokerComponent.h"
그리고 생성자 함수 안에 아래 코드를 넣어준다.
// 활성화될 범위 설정.
NavGenerationRadius = 10.0f; // 주변 반경 내 NavMesh 생성 범위
NavRemovalRadius = 15.0f; // 반경 밖의 NevMesh 제거 범위
// Navigation Invoker 컴포넌트 생성 및 초기값 셋업.
NavInvoker = CreateDefaultSubobject<UNavigationInvokerComponent>(TEXT("NavInvoker"));
// SetGenerationRadii 함수를 사용하여 생성 반경과 제거 반경 설정. Protected 멤버변수이므로 함수를 통해 수정 필요.
NavInvoker->SetGenerationRadii(NavGenerationRadius, NavRemovalRadius);
그리고 Build.cs파일에 "NavigationSystem"모듈을 아래와같이 추가해준다.
....
using UnrealBuildTool;
public class SCC_UEAI : ModuleRules
{
public SCC_UEAI(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EnhancedInput",
"NavigationSystem"
// NavigationSystem 모듈 추가
});
....
그리고 언리얼 에디터를 빌드한 다음
1. Project Settings > Navigation Mesh > Runtime Generation = Dynamic
2. Project Settings > Navigation System > Navigation Enforcing > Generate Navigation Only Around Navigation Invokers = true
위에 설정대로 변경해 준다.
그런다음 Navigation Invoker를 적용한 AICharacter에 블루프린트로 들어가서 Nav Invoker컴포넌트가 정상적으로 있는지 확인해준다.
그리고 레벨에 AICharacter를 배치해보면
AICharacter에 설정한 Navigation Invoker 크기만큼에 NavMesh만 활성화 되는 모습을 확인 할 수 있다.
이렇게 이동하는 AICharacter나 액터 등에 Invoker를 사용해 NevMesh의 영역을 조절할 수 있게되어 더 효율적인 AICharacter에 움직임 을 구현할 수있다.
Navigation Invoker에 장점
1. 퍼포먼스 최적화
- NavMesh는 생성 비용이 꽤 크기때문에 절약이 가능하다.
- 레벨 전체에 NavMesh를 생성하면 GPU/CPU 부담이 커진다.
- 인보커를 쓰면 캐릭터 주변에만 NavMesh가 유지되니까 리소스가 엄청 절약된다.
2. 동적 지형 대응
- 게임 도중 구조가 바뀌는 상황 (예: 문 열림, 다리 생성 등)도 실시간 대응 가능
- Static은 이런 변화 대응을 못 한다.
3. 필요한 곳만 계산
- 캐릭터가 갈 수 있는 영역만 순차적으로 계산됨
- 멀리 있는 맵은 아예 NavMesh가 생기지 않음
- 즉, "길이 필요한 곳만 그려주는" 지능적인 방식
Navigation Invoker 해제하는 법
Project Settings > Navigation System > Navigation Enforcing > Generate Navigation Only Around Navigation Invokers를 false로 변경하고 AICharacter를 제거한 다음에 다시 레벨에 NavMesh를 확인해보면
다시 NevMesh크기만큼에 영역이 생긴것을 확인 할 수있다.
NavMeshBoundsVolume에 초록색 영역이 다시 생성되기까지 시간이 조금 오래 걸릴 수 있고, NavMeshBoundsVolume에 위치를 잡고 조금 움직여 보면 다시 NevMesh에 영역이 생성될 것이다.
'Unreal_Engine 5 > UE5 AI(NPC, Enemy)' 카테고리의 다른 글
UE5 AI(NPC, Enemy)(3) Nav Modifier Volume (0) | 2025.04.25 |
---|---|
UE5 AI(NPC, Enemy)(1) AIController, Behavior Tree, Blackboard (0) | 2025.04.23 |