언리얼 엔진 본캠프 19주차-5 언리얼 엔진 C++ : AI(Advanced) - 네비게이션 메시 생성 및 경로 탐색

정재훈·2025년 4월 25일
0

unreal engine

목록 보기
40/45

AI Controller : 우리 뇌-신경처럼 게임속 AI 액터를 찾아서 움직이도록 조작

Behavior Tree : 어떤 상황에 무슨 행동을 할지 등 상황 판단 행동 규약(알고리즘)을 저장

Blackboard : 뇌처럼 AI가 해야 할 일 등의 정보와 키(Key) 등을 기억(저장)

  • AI Controller와 Behavior Tree 사이에서 AI의 의사결정에 필요한 정보를 주고받도록 도와주는 저장소

네비게이션 메시 설정 및 경로 찾기

NavMeshBoundsVolume : AI뿐만 아니라 내비게이션 메시 시스템을 사용하는 모든 오브젝트의 이동 영역을 정의하는 볼륨

  • 이 Volume 객체를 Runtime에 생성, 변경할 수 없음. 엔진을 그렇게 만들어 놓음 = 한계점
    => 근데 게임을 만들다 보면 AI가 처음엔 못가던 곳을 어떤 조건에 따라 나중에는 갈 수 있도록 만들고 싶을 수 있음
    => 위와 같은 한계점을 회피하는 방법을 생각해야함

Runtime Generation

    • Static : 내비게이션 메시가 오프라인에서 생성되고 레벨과 함께 저장. 내비게이션 메시는 런타임에서 로드되며 변경 불가능
    • Dynamic Modifiers Only : 내비게이션 메시가 오프라인에서 생성되고 레벨과 함께 저장. 런타임에서는 내비게이션 모디파이어(Navigation Modifier)만 비용 또는 블록 영역을 변경하여 기존 내비게이션 메시를 수정할 수 있음. 런타임에서 새로운 내비게이션 메시 표면은 생성 X
      • NavModifier Component
    • Dynamic : 내비게이션 메시가 오프라인에서 생성되고 레벨과 함께 저장되거나 런타임에 생성. 런타임에서 내비게이션 메시가 사용하는 내비게이션 관련 데이터가 업데이트될 수 있고, 생성은 데이터 변경에 영향받은 타일에서 수행

Navigation Invoker : NavMeshBoundsVolume이 Mesh를 만들 때 발생하는 비효율적인 연산을 효율적이게 바꿔줌

  • NavMeshBoundsVolume은 동적 생성, 변경이 불가능하니까, 맵 전체에 미리 깔아 놔야하는데, 이 전체에 대한 연산을 하는 것은 굉장히 비효율적임
  • => Navigation Invoker라는 Component를 가진 액터의 주변 영역만 연산하여 AI 주변에만 NavMesh가 만들어지도록 함
  • Build.cs 파일에서 "NavigationSystem" 모듈 추가

Nav Modifier Volume : 배치된 구역의 이동 비용을 높일 수 있는 볼륨

  • Area Class에 따라 아예 지나갈 수 없는 영역으로 만들 수도 있음

AI Character 이동 시에는 AIController의 내장 함수인 MoveToActor() / MoveToLocation() 사용


장애물 회피 및 동적 경로 탐색

RVO(Reciprocal Velocity Obstacles) : AI 캐릭터들이 서로 충돌하지 않고 자연스럽게 회피/이동할 수 있게 도와주는 알고리즘

  • CharacterMovementComponent 내 RVO 옵션 설정
    • bUseRVOAvoidance : RVO 충돌 회피 알고리즘 활성화
    • AvoidanceConsiderationRadius : 회피 시작 거리
    • AvoidanceWeight : 회피 가중치
      • 0.0f에 가까울수록 이 캐릭터가 다른 캐릭터를 먼저 회피 (낮은 계급이 됨)
      • 1.0f에 가까울수록 다른 캐릭터들이 이 캐릭터를 먼저 회피 (높은 계급이 됨)
  • RVO Off
  • RVO On : AvoidanceRadius = 500.0f, AvoidanceWeight = 0.5f

플레이어 추적 AI

플레이어 추적을 위한 AIController 생성

  • AI 상태 정의

  • 매 틱 AI의 상태를 체크

    • 타겟과의 거리에 따라 상태 변경
      • dist > LoseInterestRadius = Idle
      • dist < ChaseRadius = Chasing
      • ChaseRadius < dist < DetectionRadius = Suspicious;
  • Chasing 상태일 때 추적

인지 시스템 추가

제공된 코드는 잘 안됐음

  • Sight Sense 추가

AIController는 기본적으로 AIPerceptionComponent를 가지고 있음. 근데 할당하지 않으면 에디터에서 안보였음(그냥 포인터로만 가지고 있는 듯)

그래서 직접 할당하고, Sense값 초기화

OnTargetPerceptionUpdated에 바인딩되는 OnPerceptionUpdated함수에서도 AI 캐릭터가 플레이어 캐릭터를 인지했을 때, 서로 간의 거리에 따라 AI 캐릭터의 상태를 변경

마지막으로 플레이어 캐릭터도 AI에게 인지될 수 있도록 AIPerceptionStimuliSouceComponent 추가







참조 사이트
1. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/using-avoidance-with-the-navigation-system-in-unreal-engine
2. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/overview-of-how-to-modify-the-navigation-mesh-in-unreal-engine
3. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/automatic-navigation-link-generation#%EC%96%B8%EB%A6%AC%EC%96%BC%EC%97%94%EC%A7%84%EC%9D%98%EB%82%B4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98%EB%A7%81%ED%81%AC
4. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/automatic-navigation-link-generation#%EB%82%B4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98%EB%A7%81%ED%81%AC%EB%B9%84%ED%97%A4%EC%9D%B4%EB%B9%84%EC%96%B4%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0
------ AIController의 AIPerceptionComponent
5. https://forums.unrealengine.com/t/uaiperceptioncomponent-added-in-aicontroller-via-c-wont-allow-me-to-add-senses/468928
6. https://forums.unrealengine.com/t/perception-component-added-in-c-wont-allow-senses-config-in-derived-blueprint/394093/3

profile
드가자

0개의 댓글