스크립팅하는애님 2024. 5. 21. 23:50

패키지가 어떻게 구성되어 있는지에 대한 개요.

여기서는 패키지의 다양한 부분이 어떻게 조합되는지 배울 수 있습니다.

개요

패키지는 여러 가지 다른 부분으로 구성되어 있습니다. 대략적으로 다음과 같이 그룹화할 수 있습니다:

  • Movement scripts (이동 스크립트): 에이전트가 어떻게 이동하고 어디로 이동해야 하는지를 지시합니다 (  Movement scripts 참조).
  • Graphs (그래프): 에이전트가 이동할 수 있는 위치를 설명합니다 (  Graph Updates 참조).
  • Temporary obstacles (임시 장애물): 네비게이션 메쉬에 구멍을 내거나 다른 방식으로 업데이트합니다 (그래프 업데이트 참조).
  • Off-mesh links (오프-메쉬 링크): 네비게이션 메쉬의 서로 연결되지 않은 부분 사이를 이동하거나 점프할 수 있게 합니다 ( NodeLink2 참조).
  • 경로 수정자: 예를 들어 경로를 부드럽게 하기 위해 경로를 후처리합니다 (  Using Modifiers 참조).

주로 상호 작용하게 되는 것은 이동 스크립트와 Seeker 컴포넌트입니다. 둘 다 이동해야 하는 에이전트에 첨부되어야 합니다. 이동 스크립트는 에이전트가 어떻게 이동해야 하는지, 속도, 회전 등을 제어하며 현재 목적지가 어디인지, 언제 경로를 다시 계산해야 하는지를 결정합니다. Seeker 컴포넌트는 이동 스크립트에 의해 제어됩니다. 이동 스크립트는 경로를 계산하라고 지시하며, Seeker는 이를 실행하고 나중에(아마도 다음 프레임에서) 결과를 이동 스크립트에 반환합니다. Seeker는 또한 첨부된 경로 수정자를 실행하는 책임도 집니다.

AstarPath 컴포넌트는 씬의 모든 그래프 데이터를 보유합니다. 싱글톤 패턴을 따르므로 씬에 하나의 컴포넌트만 있어야 합니다. 동일하거나 다른 유형의 하나 이상의 그래프를 포함할 수 있습니다. 각 그래프는 많은 노드를 포함하고 관리합니다(때로는 수백만 개까지).

그래프 데이터에 직접 액세스할 수 있습니다. 이에 대한 자세한 내용은 그래프 데이터 액세스 참조를 확인하세요.

로컬 회피 시스템은 경로 찾기와 거의 완전히 분리되어 있습니다. 로컬 회피는 사용 중인 그래프나 그래프의 존재 여부에 신경 쓰지 않습니다. 이동 스크립트는 RVOController 컴포넌트를 사용하여 로컬 회피와 상호 작용하며, 이를 캐릭터 게임 오브젝트에 첨부할 수 있습니다. 로컬 회피 시뮬레이션 자체는 RVOSimulator 컴포넌트에 의해 수행됩니다. 이 컴포넌트도 싱글톤 패턴을 따르므로 씬에 하나만 존재해야 합니다. RVOSimulator는 자체 내부 작업 스레드를 사용하여 최대 성능으로 로컬 회피를 시뮬레이션합니다.

경로 계산

이동 스크립트의 목적지를 설정하면 일련의 이벤트가 발생합니다:

  • 이동 스크립트는 곧 목적지가 변경되었음을 인식하고 자동 경로 재계산을 예약합니다.
  • 경로 객체(예: ABPath)를 생성하여 Seeker에 계산을 요청합니다 (FollowerEntity는 Seeker를 건너뜁니다).
  • Seeker는 몇 가지 설정을 적용한 후 경로를 주요 AstarPath 컴포넌트에 보냅니다.
  • 경로는 대기열에 들어가며 작업 스레드가 가능한 한 빨리 이를 처리합니다. 동시에 여러 작업 스레드가 경로 찾기 작업을 수행할 수 있습니다.
  • 작업 스레드는 A* 알고리즘을 사용하여 경로를 계산합니다. 자세한 내용은 [여기](https://www.redblobgames.com/pathfinding/a-star/introduction.html)를 참조하세요.
  • 작업 스레드가 경로 계산을 완료하고 계산된 경로를 반환 대기열에 넣습니다.
  • 다음 업데이트 루프에서 AstarPath 컴포넌트는 경로가 계산되었음을 Seeker 컴포넌트에 알립니다.
  • Seeker는 경로를 부드럽게 하거나 다른 방식으로 후처리하는 수정자를 실행합니다. 수정자 사용 참조.
  • 마지막으로, Seeker는 경로가 계산되어 따라갈 준비가 되었음을 이동 스크립트에 알리는 콜백을 호출합니다.

원한다면 Seeker 컴포넌트를 우회하고 AstarPath 컴포넌트를 직접 사용할 수도 있습니다. 경로 검색에 대한 자세한 내용은 경로 검색 참조를 확인하세요.