AIController→MoveTo() 함수를 통해 AI가 지정된 대상(TargetActor) 에게 자동으로 이동하도록 요청한다.
요청 결과에 따라 행동 트리 노드가 성공, 실패, 진행중 을 반환하도록 한다.
- FAIMoveRequest MoveRequest;
- AI 이동 요청을 생성하는 구조체
- FAIMoveRequest는 AI가 어디로, 어떻게 이동할지를 지정할 수 있는 여러 설정( 목표 Actor위치, Acceptace Radius 등 ) 을 담음
- MoveRequest.SetGoalActor(TargetActor);
- 이동 목표를 TargetActor로 설정
- 즉, 이 AI는 이 Actor를 향해 경로 탐색을 시작
- 내부적으로 이 Actor의 현재 위치가 Destination이 됌.
- MoveRequest.SetAcceptanceRadius(50.0f);
- 목표지점에 도착했다고 판단하는 허용 반경 설정
- 50.0 은 Unreal unit defautl : 50.0cm
- 주의: 너무 작게 설정하면 목표에 아무리 가까이 가도 아직 도착 안했다고 판단될 수 있다. pivot 기준인듯?
- MoveRequest.SetUsePathfinding(true);
- 이 요청에서 네비게이션 메시를 사용한 경로 탐색을 수행할지 결정
- 기본값은 true
- false로 설정하면 직선으로 TargetLocation까지 가려고 시도하며, 장애물은 무시
- MoveRequest.SetAllowPartialPath(true);
- 목표 지점까지 완벽한 경로가 없더라도 가능한 지점까지만 이동할 수 있게 허용
- 기본값은 true
- false로 하면 목표가 완전한 경로가 있을 때만 이동
- 예) 플레이어가 절벽 뒤에 있어서 완전 도달할 수 없는 경우, true면 절벽 앞까지 이동
- 그 외 구조확인
- FAIMoveRequest MoveRequest;
MoveRequest.SetGoalActor(TargetActor); // 이동 목표 Actor
MoveRequest.SetGoalLocation(TargetLocation); // 이동 목표 위치 (위와 둘 중 하나만 사용)
MoveRequest.SetAcceptanceRadius(50.f); // 도착으로 판단하는 반경
MoveRequest.SetUsePathfinding(true); // 네비게이션 사용 여부
MoveRequest.SetAllowPartialPath(true); // 일부 경로만이라도 허용
MoveRequest.SetCanStrafe(false); // 옆걸음 가능 여부
MoveRequest.SetNavigationFilter(MyFilterClass); // 커스텀 네비 필터 설정
- FNavPathSharedPtr NavPath;
- AI가 실제로 따라갈 네비게이션 경로를 받을 변수
- SharedPtr은 자동 참조 관리 포인터, 내부적으로 FNavigationPath를 참조
- 이걸 이용해서 이동경로 시각화, 분석 가능
- FPathFollowingRequestResult Result; = AIController→MoveTo(MoveRequest, &NavPath);
- AI에게 MoveRequest를 수행하라고 명령
- &NavPath를 넘겨서 경로 결과를 받을 준비도 함께 한다.
- 반환값인 Result는 EPathFollowingRequestResult 열거형중 하나, 이동 명령의 처리 결과 상태를 알려줌

MoveToActor() 함수 설명
✅ 함수 시그니처
virtual EPathFollowingRequestResult::Type MoveToActor(
AActor* Goal,
float AcceptanceRadius = 5.0f,
bool bStopOnOverlap = true,
bool bUsePathfinding = true,
bool bCanStrafe = false,
TSubclassOf<UNavigationQueryFilter> FilterClass = nullptr,
bool bAllowPartialPath = true
);
🔍 파라미터 설명:
| 파라미터 | 설명 |
|---|
Goal | 목표 Actor |
AcceptanceRadius | 목표 주변 허용 반경 (도착 판정용) |
bStopOnOverlap | 도착 시 콜리전 오버랩 상태면 멈출지 여부 |
bUsePathfinding | NavMesh 경로 탐색을 사용할지 여부 |
bCanStrafe | 이동 중 좌우 이동을 허용할지 (AI가 옆으로 움직이는 행동) |
FilterClass | 경로 탐색 시 사용할 필터 (예: 특정 NavArea 회피 등) |
bAllowPartialPath | 완전한 경로가 없더라도 일부 경로로 이동 허용 |
EPathFollowingRequestResult vs GetMoveStatus()
| 항목 | EPathFollowingRequestResult | GetMoveStatus() |
|---|
| 무엇인가? | 이동 "요청" 결과 enum | 현재 AI 이동 "상태" enum |
| 어디서 쓰나? | MoveTo() 요청 직후 | 이동 도중 상태 모니터링 |
| 반환 위치 | FAIController::MoveTo(...) 결과에 포함 | AIController->GetMoveStatus() |
| 종류 예시 | RequestSuccessful, AlreadyAtGoal, Failed | Idle, Moving, Paused, Waiting |
| 역할 요약 | 요청이 잘 "접수"되었는지를 판단 | 실제 "이동 중인지 도착했는지" 상태 판단 |
✅ 2. 왜 Idle을 "도착"으로 간주하는가?
- AI가 목표 지점에 도달하면 이동이 자동으로 중단되고,
MoveStatus가 Idle로 바뀝니다.
- 또는 이동 중 경로 실패/중단도
Idle이 될 수 있기 때문에 조금 더 안전하게 처리하려면 경로 실패 여부도 함께 검사하는 게 좋다.