Make Unreal REAL.
article thumbnail
이득우의 언리얼 C++ 게임 개발의 정석

 

AI 컨트롤러(AI Controller)는 플레이어 컨트롤러와 동일한 방식으로 폰에 빙의할 수 있다.

 

새로운 AI 컨트롤러를 만든다.

 

 

새로운 클래스를 생성했으니 CoreMinimal.h를 ArenaBattle.h로 변경한다.

 

 

캐릭터 클래스에 AI 컨트롤러를 설정하기 위해 헤더를 포함한다.

 

 

AI 컨트롤러 클래스를 AABAIController 클래스로 지정한다.

 

AutoPossessAI 옵션은 다음과 같다.

  • EAutoPossessAI::Disabled
    자동으로 빙의하지 않는다.
  • EAutoPossessAI::PlacedInWorld
    폰이 이미 월드에 배치되어 있는 경우에만 빙의한다.
  • EAutoPossessAI::Spawned
    폰이 새로 Spawn 되는 경우에만 빙의한다.
  • EAutoPossessAI::PlacedInWorldOrSpawned
    두 상황 모두에 빙의한다.

 

AutoPossessAI 조건에 상황이 맞으면 설정된 AI 컨트롤러 클래스 형식의 AI 컨트롤러가 자동으로 생성되고 폰에 빙의한다.

 

 

캐릭터의 수만큼 AI 컨트롤러가 생성되었고 각 폰에 빙의하고 있다.

 

 

AI가 내비게이션 시스템을 통해 스스로 길을 찾기 위해서는 내비게이션 메시가 배치되어 있어야 한다.

 

AI가 이동하게 될 영역 전체를 덮는 NavMesh Bounds Volume을 배치하고 크기를 조절한다.

  • 퍼포먼스 최적화를 위해 크기는 필요한 만큼만 포함하도록 한다.

 

 

볼륨을 배치한 후 뷰포트에서 P 키를 누르면 초록색으로 이동 가능 영역이 표시된다.

 

 

내비게이션 시스템과 타이머를 이용해 3초마다 새로운 위치로 AI를 이동시켜보겠다.

 

컨트롤러가 폰을 소유할 때, 소유를 해제할 때 호출되는 AController::OnPossess() 함수와 AController::OnUnPossess() 함수를 오버라이드 한다.

 

OnRepeatTimer() 함수는 RepeatInterval마다 실행시킬 것이며 FTimerHandle 타입의 RepeatTimerHandle 변수를 통해 관리한다.

 

 

내비게이션 시스템을 사용하기 위해서는 UMG와 비슷하게 {프로젝트명}.Build.cs 파일에 모듈을 추가해줘야 한다.

 

 

내비게이션 시스템과 AI를 이동시키기 위한 헤더를 포함한다.

 

 

생성자에서 타이머의 실행 간격 기본값을 설정한다.

 

OnPossess() 함수에서 OnRepeatTime() 함수를 초기 딜레이 없이 3초마다 반복 실행하도록 하고 RepeatTimerHandle 변수를 통해 관리하도록 한다.

  • GetWorld()->GetTimerManager().SetTimer() 함수를 통해 타이머를 등록할 수 있다.

 

OnUnPossess() 함수에서 RepeatTimerHandle에 해당하는 타이머를 종료시킨다.

  • GetWorld()->GetTimerManager().ClearTimer() 함수를 통해 타이머를 종료할 수 있다.

 

 

3초마다 실행될 OnRepeatTimer() 함수에서는 다음을 실행한다.

 

UNavigationSystemV1::GetNavigationSystem(GetWorld()) 함수를 통해 월드의 내비게이션 시스템을 가져온다.

 

UNavigationSystemV1->GetRandomPointInNavigableRadius() 함수를 통해 중심이 Origin이고 반지름이 Radius인 구 내에서 AI가 이동 가능한 랜덤 위치 1개를 FNavLocation에 저장시킬 수 있다.

  • 성공 여부를 반환한다.

 

이동 가능한 위치를 찾았을 경우 UAIBlueprintHelperLibrary::SimpleMoveToLocation() 함수를 통해 AI를 이동시킨다.

  • 인자로 AController 타입의 컨트롤러와 FVector 타입의 목적지를 전달한다.
  • FNavLocation.Location을 통해 위치를 가져올 수 있다.

 

 

3초 마다 AI를 새로운 위치로 이동시키는 데 성공했다.

 

 

참고로 UNavigationSystemV1::SimpleMoveToLocation() 함수는 Deprecated되어 작동하지 않으므로 사용하면 안 된다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그