최종 프로젝트 - Chasing

정혜창·2025년 5월 14일

내일배움캠프

목록 보기
56/64

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도착 시 콜리전 오버랩 상태면 멈출지 여부
bUsePathfindingNavMesh 경로 탐색을 사용할지 여부
bCanStrafe이동 중 좌우 이동을 허용할지 (AI가 옆으로 움직이는 행동)
FilterClass경로 탐색 시 사용할 필터 (예: 특정 NavArea 회피 등)
bAllowPartialPath완전한 경로가 없더라도 일부 경로로 이동 허용

EPathFollowingRequestResult vs GetMoveStatus()

항목EPathFollowingRequestResultGetMoveStatus()
무엇인가?이동 "요청" 결과 enum현재 AI 이동 "상태" enum
어디서 쓰나?MoveTo() 요청 직후이동 도중 상태 모니터링
반환 위치FAIController::MoveTo(...) 결과에 포함AIController->GetMoveStatus()
종류 예시RequestSuccessful, AlreadyAtGoal, FailedIdle, Moving, Paused, Waiting
역할 요약요청이 잘 "접수"되었는지를 판단실제 "이동 중인지 도착했는지" 상태 판단

✅ 2. 왜 Idle을 "도착"으로 간주하는가?

  • AI가 목표 지점에 도달하면 이동이 자동으로 중단되고, MoveStatusIdle로 바뀝니다.
  • 또는 이동 중 경로 실패/중단도 Idle이 될 수 있기 때문에 조금 더 안전하게 처리하려면 경로 실패 여부도 함께 검사하는 게 좋다.
profile
Unreal 1기

0개의 댓글