다양한 그래프 유형의 간단한 개요

이 프로젝트에는 여러 가지 그래프 유형이 포함되어 있으며, 직접 작성할 수도 있습니다.
이 문서에서는 다양한 그래프 유형과 그 설정에 대해 간략히 설명합니다.

그래프는 세계의 이동 가능한 영역을 나타냅니다. 이는 노드와 그들 간의 연결로 이루어져 있습니다. 그래프마다 세계를 표현하는 방식이 다르며, 점, 그리드 타일, 삼각형 메쉬 등 다양한 형태가 있습니다. 따라서 각기 다른 그래프는 서로 다른 유형의 게임에 더 적합합니다.

 

간단히 말해, 어떤 그래프를 사용해야 할까요?

게임에 가장 적합한 그래프 유형을 처음 평가하려면, 이 플로우차트를 사용하세요:

 

 

 

  • ¹ 큰 세계란 무엇인가요? 상황에 따라 다르지만, 그리드 그래프가 400x400 노드보다 커야 한다면 리캐스트 그래프가 더 나은 선택입니다.
  • ² 구형 세계나 다른 특이한 세계 형태의 경우, 구형 세계를 참고하세요.
  • ³ 이 패키지는 안타깝게도 사이드 스크롤링 게임에 대한 지원이 적습니다. 그러나 포인트 그래프는 일부 게임에서 잘 작동할 수 있습니다.
  • ⁴ 무한한 세계의 경우, 작은 이동 그래프를 참고하세요.

이 가이드는 대략적인 안내일 뿐이며, 각 그래프의 장단점에 대한 자세한 정보는 페이지의 나머지 부분을 참고해야 합니다.

 

Grid Graph

 

그리드 그래프는 가장 간단한 그래프입니다. 이름에서 알 수 있듯이, 그리드 패턴으로 노드를 생성합니다. 대부분의 장면에서 잘 작동하며, 런타임 중에 그래프를 업데이트해야 하는 경우에 특히 유용합니다(RTS나 타워 디펜스 게임 등). 하지만 성능 및 메모리 측면에서 큰 세계와 큰 개방 공간을 처리하는 데는 그다지 좋지 않습니다. 모든 영역을 동일한 노드 밀도로 나타내기 때문입니다.

장점:

  • 그리드 그래프는 패널티와 태그와 잘 작동합니다.
  • 그래프 업데이트가 빠릅니다.
  • 그래프 스캔이 비교적 빠릅니다.

단점:

  • 메모리 사용량이 리캐스트 그래프보다 많습니다.
  • 장거리 경로 탐색이 리캐스트 그래프보다 느릴 수 있습니다.
  • 매우 큰 세계에서는 확장되지 않습니다.
Pathfinding.GridGraph를 참조

 

Hexagonal Grid Graph

 

그리드 그래프를 생성하고 그리드 그래프 인스펙터의 Shape 옵션을 Hexagonal로 변경하여 육각형 그래프를 만들 수 있습니다. 일반 그리드 그래프와 동일한 장단점이 적용됩니다.

 

예제를 보려면 'Example14_TurnBased_Hexagon'이라는 예제 장면을 참조하세요.

 

Layered Grid Graph - A* Pro Only

 

GridGraph는 훌륭하지만, 여러 층이 있는 집과 같은 중첩된 영역을 잘 처리하지 못합니다. 그래서 중첩된 영역을 지원하는 그리드 그래프가 있습니다. 이 그래프는 일반 그리드 그래프에 비해 약간 더 많은 메모리를 사용하지만, 그 외에는 동일하게 작동합니다.

Pathfinding.GridGraph를 참조

 

 

Recast Graph - A* Pro 전용

 

리캐스트 그래프는 그리드 대신 삼각형 네비게이션 메쉬를 생성합니다. 이는 Recast라는 오픈 소스 네비게이션 시스템을 기반으로 하며, Unity에서 네이티브로 실행됩니다.

리캐스트 그래프 생성기는 세계를 복셀화(고해상도 Minecraft 세계처럼 많은 큐브로 변환)하고 네비게이션 메쉬를 생성하여 Navmesh Graph와 유사하게 사용할 수 있습니다. 몇 초 만에 강력한 메쉬를 생성할 수 있으며, 수동 메쉬 빌딩에 몇 시간이 걸릴 수 있습니다.

Unity의 네비게이션 시스템을 사용한 적이 있다면 이 그래프가 익숙할 것입니다. Unity의 시스템도 Recast를 기반으로 하기 때문입니다.

3D 모델링 프로그램에서 수동으로 네비게이션 메쉬를 생성하고자 한다면 Navmesh Graph를 사용할 수 있습니다.

장점:

  • 작은 디테일과 큰 영역을 동시에 표현할 수 있습니다.
  • 노드 수가 적어 경로 탐색이 빠릅니다.
  • 대규모 세계를 지원합니다.
  • Navmesh Cutting을 사용한 빠른 업데이트(주로 네비게이션 메쉬에 구멍을 뚫는 데 사용).
  • 전체 리캐스트 그래프 타일을 재계산하는 빠른 그래프 업데이트.
  • 상대적으로 낮은 메모리 사용량.

단점:

  • 매우 높은 디테일이나 매우 큰 세계가 필요한 경우 스캔이 느릴 수 있습니다.
  • 그리드 그래프보다 업데이트가 느림(하지만 Navmesh Cutting을 사용할 수 있다면 빠름).
  • 나무나 장애물이 없는 언덕과 같은 큰 굴곡이 있는 빈 지역은 리캐스트 그래프가 잘 표현하지 못할 수 있습니다. 타일링을 활성화하면 큰 노드를 나누는 데 도움이 될 수 있습니다.
  • 태그와 패널티를 표현하는 데 좋지 않음.
RecastGraphUsing navmeshes 참조

 

 

Navmesh Graph

네비메시 그래프는 경로 탐색 데이터를 사각형(그리드 그래프)이나 점(포인트 그래프) 대신 삼각형 메쉬로 나타냅니다. 이는 런타임 중 많은 변경이 필요하지 않은 매끄럽고 빠른 경로 탐색에 적합합니다. 노드 수가 적기 때문에 그리드 그래프보다 빠르며, 반환된 경로는 직접 사용할 수 있지만 퍼널 수정자를 강력히 권장합니다.

이 시스템은 네비메시를 자동으로 생성할 수 있지만(리캐스트 그래프 - A* Pro 전용 참고), 이 그래프를 사용하려면 선호하는 3D 모델링 애플리케이션에서 직접 생성해야 합니다. 네비메시는 다각형이 이동 가능한 영역을 설명하는 메쉬입니다. 정점은 항상 메쉬의 가장자리에 있어야 하며(특정한 경우 제외), 매우 긴 가장자리를 나누는 것도 좋은 방법입니다.

 

장점:

  • 작은 디테일과 큰 영역을 동시에 표현 가능
  • 노드 수가 적어 경로 탐색이 빠름
  • 대규모 세계 지원
  • Navmesh Cutting을 사용한 빠른 업데이트(주로 네비메시에 구멍을 뚫는 데 제한됨)
  • 상대적으로 낮은 메모리 사용량
  • 스캔 속도가 빠름

단점:

  • 네비메시 생성에 많은 수작업 필요
  • 태그와 패널티를 표현하는 데 좋지 않음
Pathfinding.NavMeshGraphCreating a navmesh manually, Using navmeshes 참조

 

Point Graph

 

포인트 그래프는 모든 그래프 유형 중 가장 단순하지만 많은 사용자 정의를 허용합니다. 이는 연결된 사용자 배치 점들로 구성됩니다.

포인트 그래프는 루트 변환을 기준으로 스캔되며, 모든 자식을 노드로 취급합니다. 그런 다음 레이캐스트를 사용하여 노드 간의 연결 가능성을 확인하여 링크 여부를 결정합니다. 포인트 그래프에서 좋은 경로를 얻는 것은 어려울 수 있으며, 레이캐스트 수정자가 괜찮은 결과를 제공합니다.

포인트 그래프의 일반적인 문제는 많은 노드를 추가하지 않으면 "올바른" 가장 가까운 노드를 얻기 어렵다는 것입니다. 예를 들어, 에이전트가 벽에 가까이 이동하면 가장 가까운 노드는 벽의 반대편에 있을 수 있습니다. 노드를 너무 드물게 배치하지 않도록 하여 이를 완화할 수 있습니다.

다른 그래프 유형이 게임에 적합하지 않은 경우를 제외하고 이 그래프 유형의 사용은 권장되지 않습니다.

장점:

  • 노드 배치에 대한 완전한 제어 가능. 이를 통해 3D 경로 탐색도 가능.
  • 간단한 경우에는 스캔이 빠름.

단점:

  • 모든 노드를 배치하는 데 많은 수작업 필요(또는 자동으로 스크립트를 작성해야 함).
  • 많은 노드가 없으면 좋은 품질의 경로를 얻기 어려움.
  • 경로 탐색이 종종 느림.
  • 그래프 업데이트가 느림.
Pathfinding.PointGraph 참조

A* inspector 의 다양한 설정에 대한 간략한 개요입니다.

  • AstarPath 구성 요소의 인스펙터에는 다음과 같이 5개의 섹션이 있습니다.

    그래프(Graphs): 장면 내의 모든 그래프 목록을 보유합니다.
  • 설정(Settings): 다양한 경로 찾기 및 편집기 설정을 포함합니다.
  • 저장 및 불러오기(Save & Load): 파일에서 그래프를 저장하고 불러오는 기능을 제공합니다.
  • 최적화(Optimization): 컴파일러 지시문을 사용하여 시스템에 적용할 수 있는 다양한 최적화를 포함합니다.
  • 정보(About): 사용 중인 버전 및 문서에 대한 링크 등에 대한 정보를 제공합니다.

또한 '그래프 표시(Show Graphs)' 토글이 있어 장면 보기에서 그래프를 표시하거나 숨길 수 있으며, 마지막으로 '스캔(Scan)' 버튼이 있어 모든 그래프를 재계산할 수 있습니다. 편집기에서 그래프를 스캔하지 않으면 이 버튼을 눌러야 합니다(또는 키보드 단축키를 사용하세요. 키보드 단축키 참조).

 

Graphs

 

그래프 탭에서는 현재 장면에 있는 모든 그래프를 볼 수 있습니다. 여러 개의 그래프를 가질 수 있으며, 모든 그래프는 AstarPath 구성 요소에 저장됩니다(여러 개의 AstarPath 구성 요소를 만들지 않습니다). '새 그래프 추가' 버튼을 클릭하면 생성할 수 있는 모든 그래프 유형의 목록이 표시됩니다.

각 그래프 옆에는 4개의 아이콘이 있습니다.

 

그 아이콘들은 다음과 같습니다:

  • 눈(eye): 장면 보기에서 그래프를 표시하거나 숨깁니다. 그래프가 숨겨진 경우, 이 아이콘은 빨간색으로 변합니다.
  • 펜(pen): 그래프의 이름을 바꾸려면 펜을 클릭하세요. 많은 그래프를 가지고 있고 그 중 어떤 것이 어떤 것인지 추적하기 어려울 때 매우 유용합니다.
  • 정보(i): 'i'를 클릭하면 그래프에 있는 노드 수에 관한 정보가 표시됩니다. 관련 정보를 표시하려면 그래프를 스캔해야 합니다.
  • X: 'X'를 클릭하면 그래프가 삭제됩니다.

각 그래프에 대한 설정에 대한 자세한 내용은 해당 그래프의 문서를 참조하세요.

Graph Types 을 확인하세요.

 

Settings

 

Pathfinding

쓰레드 개수(Thread Count)
사용할 경로 찾기 스레드의 개수입니다.

다중 쓰레딩은 경로 찾기를 다른 쓰레드에서 수행합니다. 이것은 2개 이상의 코어를 가진 컴퓨터에서 성능에 큰 도움이 됩니다. 왜냐하면 경로 찾기가 프레임 속도에 거의 영향을 주지 않기 때문입니다.

None은 경로 찾기가 Unity 쓰레드에서 코루틴으로 실행됨을 의미합니다.

Automatic은 컴퓨터의 코어 수와 메모리에 따라 쓰레드 수를 자동으로 조정하려고 합니다. 512MB 미만의 메모리 또는 단일 코어 컴퓨터의 경우 다중 쓰레딩을 사용하지 않도록 되돌릴 것입니다.

사용 가능한 "자동" 설정 중 하나를 사용하는 것이 권장됩니다. 이유는 컴퓨터가 강력하고 8개의 코어가 있더라도 다른 컴퓨터는 쿼드 코어 또는 듀얼 코어일 수 있기 때문입니다. 이 경우 각각 1개 또는 3개의 스레드 이상의 이점을 누릴 수 없습니다(일반적으로 Unity 쓰레드에는 하나의 코어를 남겨두는 것이 좋습니다). 컴퓨터의 코어 수보다 더 많은 스레드를 사용하면 대부분의 경우 메모리를 낭비하기만 합니다. 더 많은 메모리 사용은 중요합니다. 각 스레드는 모든 그래프의 각 노드에 대해 작은 양의 데이터를 유지해야 합니다. 이것은 전체 그래프 데이터가 아니지만 노드 수에 비례합니다. 자동 설정은 실행되는 기계를 검사하고 메모리가 낭비되지 않도록 스레드 수를 결정하여 사용합니다.

예외는 동시에 활성화된 캐릭터가 한 명(또는 두 명) 뿐인 경우입니다. 그런 경우에는 아마도 추가적인 스레드가 제공하는 추가 처리량이 필요하지 않을 가능성이 매우 낮기 때문에 항상 하나의 스레드를 사용하는 것이 좋습니다. 더 많은 스레드는 주로 서로 다른 스레드에서 서로 다른 경로를 계산함으로써 처리량을 증가시킵니다. 개별 경로를 더 빨리 계산하지는 않습니다.

경로 찾기 코어 스크립트를 수정하거나 안전한 래퍼(AddWorkItem과 같은)를 사용하지 않고 직접 그래프 데이터를 수정하는 경우 다중 쓰레딩이 이상한 오류를 발생시킬 수 있으며 신중하지 않으면 경로 찾기가 작동을 멈출 수 있습니다. 기본 사용법(경로 찾기 코어 수정 없음)에는 안전합니다.

참고:
WebGL은 전혀 스레드를 지원하지 않습니다(자바스크립트가 단일 스레드이기 때문에). 따라서 해당 플랫폼에서는 스레드가 사용되지 않습니다.
CalculateThreadCount를 확인하세요.
"A* Pro 기능
이것은 A* Pathfinding Project Pro 전용 기능입니다. 이 기능/클래스/변수는 A* Pathfinding Project의 무료 버전에 존재하지 않을 수 있으며 기능이 제한될 수 있습니다.
이 설정은 AstarPath.threadCount 멤버에 해당합니다.

 

 

최대 인접 노드 거리(Max Nearest Node Distance)
노드를 검색할 최대 거리입니다.

특정 지점의 가장 가까운 노드를 찾을 때, 이것은 허용되는 최대 거리(월드 단위)입니다.

이것은 도달할 수 없는 지점으로 경로를 요청하고 그 지점에 도달할 수 있는 가장 가까운 노드를 찾아야 할 때 관련됩니다(그 노드가 멀리 떨어져 있을 수 있음). 이 거리 내에서 노드를 찾을 수 없으면 경로가 실패합니다.

자세한 내용 및 다른 모드에 대한 설명은 Pathfinding.Heuristic를 참조하세요.
Wikipedia: Admissible heuristic
Wikipedia: A* search algorithm
Wikipedia: Dijkstra's Algorithm
경고
휴리스틱 스케일을 1 아래로 줄이거나 휴리스틱을 비활성화하면 특히 큰 그래프에 대해 경로 찾기의 CPU 비용이 상당히 증가할 수 있습니다.
이 설정은 AstarPath.heuristic 멤버에 해당합니다.

 

 

Heuristic Scale
휴리스틱의 스케일입니다.

1보다 작은 값이 사용되면 경로 탐색기는 더 많은 노드를 검색합니다(느림). 0을 사용하면 경로 찾기 알고리즘이 다익스트라 알고리즘으로 감소합니다. 이는 휴리스틱을 None으로 설정하는 것과 동일합니다. 1보다 큰 값이 사용되면 경로 찾기가 (보통) 더 빠를 수 있습니다. 왜냐하면 더 적은 노드를 확장하기 때문이지만, 경로가 최적(즉, 가능한 가장 짧은 경로)이 아닐 수 있습니다.

보통 이 값을 기본값인 1로 유지하는 것이 좋습니다.

경고
휴리스틱 스케일을 1 아래로 줄이거나 휴리스틱을 비활성화하면 특히 큰 그래프에 대해 경로 찾기의 CPU 비용이 상당히 증가할 수 있습니다.
참고:
https://en.wikipedia.org/wiki/Admissible_heuristic
https://en.wikipedia.org/wiki/A*_search_algorithm
https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
이 설정은 AstarPath.heuristicScale 멤버에 해당합니다.

 

 

Advanced

Heuristic Optimization
휴리스틱 최적화를 사용할지 여부와 피벗 포인트를 배치하는 방법입니다.

휴리스틱 최적화 (Heuristic Optimization)
Steve Rabin과 Nathan R. Sturtevant의 "Game AI Pro - Pathfinding Architecture Optimizations"에서 다루는 주제 중 하나입니다.
이 설정은 멤버 Pathfinding.Graphs.Util.EuclideanEmbedding.mode에 해당합니다.

 

 

Batch Graph Updates

성능 향상을 위해 그래프 업데이트를 제한하고 일괄 처리합니다.

이 설정이 활성화되면 그래프 업데이트가 일괄 처리되어 덜 자주 실행됩니다(그래프 업데이트 일괄 처리 간격으로 지정됨).

경로 찾기 처리량에 긍정적인 영향을 미칠 수 있으며, 경로 찾기 스레드를 자주 중지시킬 필요가 없어지며, 그래프 업데이트당 오버헤드가 감소합니다. 그러나 그래프 업데이트가 요청되고 적용되기까지의 최소 지연시간이 필요하다면 사용하지 마십시오.

이 설정은 UpdateGraphs 메서드를 사용하여 요청된 그래프 업데이트에만 적용됩니다. AddWorkItem을 사용하여 요청된 그래프 업데이트에는 적용되지 않습니다.

어느 시점에서 그래프 업데이트를 즉시 적용하려면 FlushGraphUpdates를 호출할 수 있습니다.

Graph Updates를 확인하세요.
이 설정은 멤버 AstarPath.batchGraphUpdates에 해당합니다.

 

 

Update Interval
그래프 업데이트 간의 최소 초 단위 간격입니다.

batchGraphUpdates가 true인 경우, 이는 각 그래프 업데이트 배치 간의 최소 초 단위 간격을 정의합니다.

경로 찾기 처리량에 긍정적인 영향을 미칠 수 있으며, 경로 찾기 스레드를 자주 중지시킬 필요가 없어지며, 그래프 업데이트당 오버헤드가 감소합니다. 그러나 그래프 업데이트가 요청되고 적용되기까지의 최소 지연시간이 필요하다면 사용하지 마십시오.

이 설정은 UpdateGraphs 메서드를 사용하여 요청된 그래프 업데이트에만 적용됩니다. AddWorkItem을 사용하여 요청된 그래프 업데이트에는 적용되지 않습니다.

Graph Updates 를 확인하세요.
이 설정은 AstarPath.graphUpdateBatchingInterval 멤버에 해당합니다.

 

 

Scan on Awake

이 옵션이 true로 설정되면, 모든 그래프가 Awake 동안 스캔됩니다.

이 옵션을 비활성화하면, 직접 AstarPath.active.Scan()을 호출하여 경로 찾기를 활성화해야 합니다. 또는 파일에서 저장된 그래프를 로드할 수도 있습니다.

시작 캐시가 생성된 경우(그래프 저장 및 로드 참조), 항상 그래프를 스캔하는 대신 그것을 우선적으로 로드합니다.

이 옵션은 그래프를 비동기적으로 스캔하거나, 게임 시작 시 아직 생성되지 않은 절차적 세계가 있는 경우 유용할 수 있습니다.

Scan ScanAsync 참조
이 설정은 AstarPath.scanOnStartup 멤버에 해당합니다.

 

 

Debug

Path Logging
디버깅 메시지의 양을 설정합니다.

디버깅을 줄이면 성능이 약간 향상되거나 콘솔 스팸을 없앨 수 있습니다. 디버깅을 많이 사용하면 경로 찾기 스크립트가 무엇을 하는지에 대한 정보를 더 많이 얻을 수 있습니다. InGame 옵션은 최신 경로 로그를 게임 내 GUI를 통해 표시합니다.

이 설정은 AstarPath.logPathResults 멤버에 해당합니다.

 

Graph Coloring

씬뷰에서 노드를 그리는 데 사용할 모드를 설정합니다.

참고  
에디터에서만 관련이 있습니다.
Pathfinding.GraphDebugMode를 참조하십시오.
이 설정은 AstarPath.debugMode 멤버에 해당합니다.

 

 

Show Search Tree

이 옵션을 활성화하면 노드가 '부모'로 선을 그립니다.
이는 최신 경로의 탐색 트리를 표시합니다.

참고  
에디터에서만 관련이 있습니다.
이 설정은 AstarPath.showSearchTree 멤버에 해당합니다.

 

 

Show Unwalkable Nodes

통행 불가 노드를 표시하려면 이 옵션을 켜십시오.

참고  
에디터에서만 관련이 있습니다.
unwalkableNodeDebugSize를 참조하십시오.
이 설정은 AstarPath.showUnwalkableNodes 멤버에 해당합니다.

 

Colors   

여기에서 그래프를 시각화하기 위해 씬뷰에서 사용할 색상을 설정할 수 있습니다.

 

Tag Names

여기에서 모든 태그의 이름을 설정할 수 있습니다.

Working with tags 참조

 

 

Editor

Smooth Transitions 

드롭다운을 열고 닫을 때 애니메이션을 추가합니다.

이 설정은 Pathfinding.FadeArea.fancyEffects 멤버에 해당합니다.

 

 

Save & Load

이 섹션에서는 나중에 로드할 수 있도록 그래프를 파일로 저장하거나, 캐시된 시작 설정을 구성할 수 있습니다. 캐시된 시작 설정은 게임 시작 시 그래프를 계산할 때 발생하는 긴 계산 시간을 피하는 방법입니다.

자세한 내용은 이 페이지를 참조하십시오: Saving and Loading Graphs

 

 

About

이 섹션은 현재 버전과 문서에 대한 링크를 보여줍니다.

참고  
이 링크는 항상 최신 비베타 문서로 연결됩니다. 그러나 다운로드 페이지의 '이전 버전 보기' 버튼을 클릭하여 이전 버전 또는 베타 릴리스에 대한 문서를 찾을 수 있습니다: 
https://www.arongranberg.com/astar/download](https://www.arongranberg.com/astar/download

 

 

Show Graphs

Show Graphs
씬뷰에서 그래프를 시각화합니다(에디터 전용).

이 설정은 AstarPath.showNavGraphs 멤버에 해당합니다.

'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글

Architecture overview  (0) 2024.05.21
Graph Types  (0) 2024.05.21
Using navmeshes > Automatically generating a navmesh  (0) 2024.05.20
Using navmeshes > Creating a navmesh manually  (0) 2024.05.20
Using navmeshes  (0) 2024.05.20

이 튜토리얼은 RecastGraph를 사용하여 게임에 자동으로 네비메시를 생성하는 방법을 보여줍니다.

이 튜토리얼은 네비메시 사용의 일부입니다.

참고: Recast Graph는 A* Pathfinding Project Pro에서만 사용할 수 있습니다.

다음과 같은 장면이 있다고 가정해보겠습니다: 가운데에 상자가 있는 간단한 바닥.

Recast 그래프는 네비메시를 자동으로 생성하여 많은 시간을 절약할 수 있습니다. 이전에 수동으로 생성한 네비메시 그래프를 제거하고 대신에 recast 그래프를 추가할 수 있습니다.

 

Recast 그래프는 장면에서 모든 메시(콜라이더가 아닌 다각형)를 가져와서 이를 복셀화합니다. 2D 복셀화의 아날로그는 여러 개의 삼각형을 가져와서 이를 텍스처에 그리는 것이며, 텍스처는 픽셀로 구성됩니다. 3D 픽셀은 복셀이라고 합니다. 그런 다음 캐릭터 높이, 캐릭터 반경 및 기타 유사한 설정과 같은 설정에서 보행 가능한 네비메시가 생성됩니다.

그래프를 직접 스캔하는 것은 대부분 좋은 결과를 얻지 못할 것입니다. 먼저 "Snap Bounds To Scene" 버튼을 누르세요. 이 버튼은 장면의 모든 메시를 찾아서 그래프의 경계를 해당 메시를 포함하도록 구성합니다. 경계를 수동으로 지정할 수도 있습니다. 경계는 씬 뷰에서 흰색 와이어 큐브로 시각화됩니다.

너비와 깊이 값은 아마도 너무 낮을 것입니다. 이러한 필드는 직접 편집할 수 없으며 대신 셀 크기(각 복셀의 크기)를 수정하여 수정해야 합니다. 이 장면에서 셀 크기를 0.1로 설정했으며, 우리의 평면이 10단위 폭이므로 그래프가 정확하게 포함되어 있습니다. 따라서 너비와 깊이 샘플의 수는 100이 됩니다. 다음으로 타일 크기를 100으로 설정하세요. Recast 그래프는 그래프를 사각형 청크로 나누기 위해 타일을 사용합니다. 타일을 완전히 비활성화할 수도 있습니다. 이는 'Use Tiles' 설정을 'Dont Use Tiles'로 설정하여 수행할 수 있습니다. 그러나 타일을 사용하는 것이 일반적으로 더 좋습니다.

 

  • 타일을 병렬로 스캔하여 스캔 속도를 크게 높일 수 있습니다.
  • 런타임 중에 recast 그래프의 개별 타일을 업데이트할 수 있으며, 이는 전체 그래프를 업데이트하는 것보다 빠릅니다.
  • navmesh 커팅은 타일별로 작동하며, 그래프의 작은 부분을 업데이트하는 것이 더 빠릅니다.
  • 매우 큰 다각형을 분할하여 매우 비최적의 경로의 위험을 줄입니다(이에 대한 자세한 내용은 네비메시 사용에서 다룹니다).

'최적의' 타일 크기는 없지만, 일반적으로 64에서 256 사이의 값이 사용됩니다.

지금 스캔을 누르면 다음과 같은 결과가 나올 것입니다: (당신의 설정을 내 것과 비교할 수 있습니다)

Recast 그래프 설정에서 'Show Outline' 및 'Show Surface'를 활성화하는 것이 좋습니다.

 

거의 모든 것이 잘 보입니다. 유일한 문제는 캐릭터도 네비메시에 포함되어 있다는 것입니다. 이는 우리가 원하지 않습니다(캐릭터는 이동하기 때문에 정적이 아닙니다). 따라서 캐릭터를 별도의 레이어(예: Transparent FX)에 배치한 다음, recast 그래프의 레이어 마스크 필드를 구성하여 네비메시 생성에서 해당 레이어를 제외하도록 설정합니다.

재생을 누르면 스캔된 그래프가 표시되고 캐릭터가 목표 지점으로 이동해야 합니다.

 

Recast 그래프에 대한 참고 사항

Recast 그래프의 해상도(인스펙터의 너비/깊이 필드)는 생성된 네비메시의 모양에 큰 영향을 미칩니다. 아래 이미지는 동일한 환경을 보여주지만 복셀화에 대해 다른 해상도를 설정한 것입니다. 큐브 사이의 얇은 영역은 충분히 높은 해상도가 설정된 경우에만 이동 가능합니다.

 

다른 예시를 보여드리겠습니다:

 

라스터화 해상도는 recast 그래프 생성에 걸리는 시간에 큰 영향을 미치지만, 런타임 성능에는 직접적인 영향을 미치지 않습니다(단, 전체 그래프 업데이트는 제외합니다). 간접적으로 큰 해상도는 그래프에 더 많은 세부 정보를 추가할 수 있으므로 런타임 성능에 약간 영향을 미칠 수 있습니다.

큰 세계용 recast 그래프는 스캔하는 데 상당한 시간이 소요될 수 있으므로 시작 시간을 개선하기 위해 결과를 캐시하는 것이 좋습니다.

 

내비메시 섹션 조정

네비메시의 일부를 조정하는 것은 때로 필요합니다. 예를 들어 특정 영역을 완전히 이동할 수 없게 만들거나, 특정 구역을 네비메시에서 제외하려는 경우가 있습니다.

이를 위해 RecastMeshObj 구성 요소를 사용할 수 있습니다. 이를 원하는 객체에 추가하고 설정을 조정하면 됩니다.

 

RecastMeshObj 구성 요소를 사용하면 다음을 수행할 수 있습니다:

  • 그래프에서 개체를 완전히 제외합니다.
  • 물체의 표면을 걸을 수 없게 만듭니다.
  • 물체의 표면을 걸어 다닐 수 있게 만듭니다(이것은 단지 기본 동작입니다).
  • 인접한 개체 사이의 navmesh에 이음새를 만듭니다.
  • 특정 태그로 개체의 표면을 표시합니다(태그 작업 참조).
RecastMeshObj를 참조하세요.

'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글

Graph Types  (0) 2024.05.21
The A* Inspector  (0) 2024.05.20
Using navmeshes > Creating a navmesh manually  (0) 2024.05.20
Using navmeshes  (0) 2024.05.20
Get Started Guide > Writing a movement script  (0) 2024.05.20

이 튜토리얼은 Blender와 같은 외부 3D 모델링 프로그램에서 navmesh를 모델링하는 방법을 보여줍니다.

이 튜토리얼은 네비메시 사용의 일부입니다.

다음과 같은 장면이 있다고 가정해보겠습니다: 가운데에 상자가 있는 간단한 바닥.

 

네비메시를 모델링하려면 좋아하는 모델링 응용 프로그램을 열어주세요. 저는 무료이며 오픈 소스인 Blender를 사용할 것입니다.

평면을 만들고, 두 번 나누고, 그런 다음 내부 네 개의 쿼드를 제거하세요.

Blender는 쿼드를 보여줍니다. 그러나 Unity로 내보낼 때 A* Pathfinding이 사용하는 삼각형으로 변환됩니다.

프로젝트의 어딘가에 FBX 파일로 내보내세요.

 

이제 Unity에서 보여야 합니다.

첫 번째 튜토리얼에서와 같이 새로운 GameObject를 만들고 "A*"이라고 이름 지어주세요(헤이러키에서 쉽게 찾을 수 있도록). 그런 다음 "AstarPath" 구성 요소를 추가하세요. 그런 다음 Graphs -> Add Graph -> Navmesh Graph를 선택하세요. 이렇게 하면 새로운 navmesh 그래프가 생성되며 해당 설정이 열립니다.

 

이전에 가져온 메시 객체(프리팹 객체가 아닌)를 navmesh 그래프의 "Source" 필드로 끌어다 놓으세요. 아마도 일부 수정 버튼이 표시될 것입니다. 기술적인 직렬화 문제 때문에 메시는 Resources 폴더에 배치되어야 하며, 해당 객체의 이름은 실제 메시와 동일해야 합니다. 수정 버튼을 클릭하면 이 작업이 수행됩니다. 물론 스크립트를 사용하여 Resources 폴더에 있지 않아도 메시를 설정할 수 있습니다.

스캔을 누르세요(Cmd+Alt+S 또는 Windows에서는 Ctrl+Alt+S). 모든 것이 잘되면 씬 뷰에 메시가 표시됩니다. 그러나 메시의 가져오기 스케일을 변경해야 할 수 있습니다(메시 에셋의 가져오기 설정에서). 일반적으로 Unity는 가져오기 스케일을 0.01로 기본 설정합니다. 이를 1로 변경하세요. 또한 모델링 도구가 사용하는 축 설정에 따라 회전해야 할 수 있습니다. navmesh 그래프 설정에서 직접 회전할 수 있습니다. Blender에서 기본 설정으로 가져올 때 (-90, 0, 0)로 회전하면 올바른 회전이 적용됩니다.

이제 스캔을 누르면 씬 뷰에 그래프가 표시됩니다. 인스펙터의 하단에 있는 "Show Graphs"가 확인되어 있는지 확인하세요.

"네비메시 사용" 페이지에서 계속됩니다.

'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글

The A* Inspector  (0) 2024.05.20
Using navmeshes > Automatically generating a navmesh  (0) 2024.05.20
Using navmeshes  (0) 2024.05.20
Get Started Guide > Writing a movement script  (0) 2024.05.20
Installation Guide  (0) 2024.05.20

A* Pathfinding Project 시작하기 - 2부 - 내비메시

이 튜토리얼은 수작업으로 모델링한 일반 내비메시 그래프와 리캐스트 그래프를 사용하여 자동으로 생성된 내비메시를 모두 다룹니다. 게임에서 사용하게 될 그래프의 유형에 관계없이 두 부분 모두 배우는 데 유용할 수 있으므로 두 부분 모두 읽어보는 것을 권장합니다.

 

Navmesh란 무엇인가요?

이 튜토리얼의 첫 번째 부분에서는 Grid Graph를 사용했습니다. 그러나 A* Pathfinding Project는 한 가지 이상의 그래프 유형을 지원하며, navmesh 그래프도 지원합니다.

GridGraph는 그리드와 같은 패턴으로 배열된 많은 노드로 구성되어 있습니다. 매우 구조화되어 있어 대부분의 경우에 잘 작동합니다. 그러나 게임에서 사용하는 넓은 풀밭에 작은 장애물을 정확하게 표현하기 위해 많은 수의 노드를 생성하는 것이 낭비처럼 느껴지지 않나요? 넓은 필드를 표현하기 위해 몇 개의 노드를 사용하고, 작은 장애물을 위해 더 많은 노드를 사용하는 것이 더 좋지 않을까요? 이때 navmesh가 필요합니다. Navmesh는 세계를 폴리곤(이 경우에는 삼각형)으로 표현하며, 게임 내 다른 메쉬와 비슷합니다. Navmesh는 캐릭터가 걸을 수 있는 표면을 정확하게 설명하는 데 사용됩니다.

위의 이미지에서 볼 수 있듯이, navmesh는 동일한 크기의 노드를 가지지 않으며, 노드는 원하는 만큼 크거나 작게 만들 수 있습니다. 그 결과, navmesh는 환경을 더 정확하게 설명할 수 있으며 빈 영역에 많은 노드를 낭비할 필요가 없기 때문에 더 작아집니다. 크기가 작아지면 경로 찾기 수행도 일반적으로 더 빨라집니다. 또한, 일반 그리드 그래프와 달리 다층 환경을 나타낼 수 있습니다 (그러나 이는 프로 버전에서 사용할 수 있는 LayeredGridGraph의 기능입니다).

 

그렇다면 단점은 무엇일까요? Navmesh 그래프의 주요 문제는 생성(또는 수작업으로 모델링)하는 데 시간이 오래 걸린다는 것입니다. GridGraph 예제 장면에서 전체 GridGraph를 스캔하는 데는 약 25-60 밀리초(컴퓨터에 따라 다름)가 걸리지만, 동등한 recast 그래프를 생성하는 데는 몇 백 밀리초가 걸리고, 더 복잡한 장면의 경우에는 몇 초가 걸릴 수 있습니다. 또한, GridGraph에 비해 업데이트 속도가 느립니다. Navmesh 컷팅을 사용하여 그래프의 제한된 빠른 업데이트가 가능하지만, recast 그래프의 경우 개별 타일을 비동기적으로 재계산할 수도 있습니다(타일에 대한 설명은 나중에 recast 튜토리얼에서 다룹니다). 그러나 이것도 여전히 상대적으로 느립니다.

 

Navmesh 생성하기

Navmesh는 수작업으로 모델링하거나 자동으로 생성할 수 있습니다. 자동 생성 기능은 프로 버전에서만 사용할 수 있습니다.

이들 서브 튜토리얼 중 하나 또는 둘 다 살펴보면서 수작업으로 또는 자동으로 navmesh를 생성하는 방법을 배우세요.

 

Creating a navmesh manually - A* Pathfinding Project

Creating a navmesh manually This tutorial shows how you can model a navmesh in an external 3D modelling program such as Blender. This tutorial is a part of Using navmeshes.Assume we have this scene: A simple plane with a box in the middle.To model a navmes

arongranberg.com

 

 

Automatically generating a navmesh - A* Pathfinding Project

This tutorial shows how you use a RecastGraph to automatically generate a navmesh for your game. Note The Recast Graph is only available in A* Pathfinding Project Pro. Assume we have this scene: A simple plane with a box in the middle. A recast graph can a

arongranberg.com

 

Navmesh 상의 이동

이전 튜토리얼에서 캐릭터를 이동시키는 간단한 스크립트를 작성했습니다. 동일한 스크립트를 사용할 수 있지만 더 나은 이동을 위해 네비메시(특히 네비메시)에서 매우 좋은 이동을 제공하는 포함된 구성 요소를 소개하겠습니다. 이를 "RichAI"라고 합니다. 새로운 GameObject를 만들고 RichAI 구성 요소를 연결하세요. 자동으로 Seeker가 연결됩니다. 시각화를 위해 캡슐 오브젝트를 루트의 자식 오브젝트로 추가하세요. 캡슐을 한 단위 올려서 루트 GameObject의 피봇 포인트가 캡슐의 바닥에 있도록 하세요. RichAI 스크립트는 캐릭터의 발이 캡슐의 바닥에 있을 것으로 가정합니다.

캐릭터에서 캡슐 콜라이더(및 기타 콜라이더)를 제거해야 합니다. 또는 RichAI 구성 요소의 Gravity -> Raycast Ground Mask 필드를 구성하여 해당 콜라이더를 제외할 수 있습니다. 왜냐하면 RichAI 구성 요소는 기본적으로 지면의 위치를 결정하기 위해 레이캐스팅을 사용하며, 그 레이캐스트가 자체에 연결된 콜라이더를 충돌하게 되면 이상한 동작이 발생합니다(스스로 확인해보세요). 또한 캐릭터 컨트롤러 구성 요소를 사용할 수도 있지만, 캐릭터 컨트롤러는 상대적으로 느리기 때문에 게임에 많은 캐릭터를 사용할 계획이 있다면 권장하지 않습니다.

AI에게 이동할 위치를 알려주려면 다른 스크립트가 필요합니다. AIDestinationSetter 구성 요소를 RichAI 구성 요소가 연결된 동일한 GameObject에 연결하세요. 이 스크립트에는 'Target'라는 단일 Transform 필드가 있으며, 이 스크립트가 하는 일은 AI에게 해당 객체로 이동하라고 알려주는 것입니다. "Target"라는 이름의 다른 GameObject를 만들고 해당 객체를 AIDestinationSetter 구성 요소의 Target 필드에 할당하세요.

참고:
아래 스크린샷은 Target 필드가 AIDestinationSetter 구성 요소가 아닌 RichAI 구성 요소에 있었던 약간 오래된 버전입니다.

 

 

이제 재생 버튼을 누르면 에이전트가 목표지점으로 이동하는 것을 볼 수 있습니다. 목표 객체를 움직이면 에이전트가 따라가야 합니다.

RichAI 스크립트는 네비메시 그래프에서의 이동을 위해 특별히 작성되었습니다. 에이전트가 항상 네비메시 위에 머무르도록 강제합니다. 이 프로젝트의 다른 이동 스크립트와 달리 RichAI는 경로 수정자를 지원하지 않습니다. 이것은 RichAI가 경로 수정자를 따르는 대신 노드 목록을 따르기 때문입니다. 이것은 캐릭터가 어느 정도 밀려도 경로 재계산 없이 여전히 올바르게 이동할 수 있는 장점이 있습니다.

RichAI의 모든 설정을 설명하는 것은 이 튜토리얼에 너무 많습니다. 여기에서 RichAI에 대한 문서를 찾을 수 있습니다: RichAI.

 

네비메시 그래프에 대한 참고 사항

RichAI 구성 요소를 사용하지 않을 때 (이 구성 요소에는 내장된 경로 간소화 기능이 있음), Seeker가 있는 GameObject에 funnel modifier를 연결하는 것이 좋습니다. funnel modifier는 경로를 간소화하여 보기에 더 매력적이고 짧게 만들어줍니다.

Pathfinding.FunnelModifier를 참조하세요.

 

네비메시 그래프는 때로 최적의 경로를 제공하지 못할 수 있습니다. 이는 경로 탐색이 노드(삼각형)의 중심에서 이루어지기 때문입니다. 이는 네비메시에 매우 큰 삼각형과 매우 작은 삼각형이 서로 가까이 배치되어 있을 때 주로 발생합니다. 경로 탐색은 보통 더 작은 삼각형을 선호합니다(가끔은 더 큰 삼각형을 선호하기도 하지만, 이 경우는 그다지 흔하지 않습니다).

 

위의 이미지에서, 찾은 경로는 초록색으로 표시되고, 그 경로를 통과하는 노드는 연한 주황색으로 표시됩니다. 실제 최단 경로는 빨간색으로 표시되고, 그 경로를 통과하는 노드는 연한 빨간색으로 표시됩니다.

이에 대한 단순한 해결책은 없습니다. 매우 큰 삼각형이 작은 삼각형에 가까이 있지 않도록하는 것이 좋습니다. recast 그래프의 경우(아래 참조), 매우 큰 삼각형을 더 작은 삼각형으로 나누기 위해 낮은 타일 크기를 지정할 수 있습니다. 또한 Max Edge Length도 낮출 수 있습니다.

Path StartPath (Vector3 start, Vector3 end, OnPathDelegate callback = null)

간단한 사용자 정의 이동 스크립트를 작성하는 튜토리얼입니다.

이 튜토리얼은 시작하는 가이드 튜토리얼의 일부입니다: 시작하기 가이드.

우리는 AI를 이동시키기 위해 정말 간단한 스크립트를 작성할 것입니다. 그러니 가장 좋아하는 스크립트 편집기를 열고 따라와주세요.

 

참고:
이 튜토리얼은 3D 게임 및 2D 게임 모두에 적용할 수 있습니다. 일부 경우에는 2D 및 3D에 대한 약간 다른 지침이 있습니다. 2D 및 3D용 코드는 거의 동일하지만 차이점이 있는 몇 군데가 있습니다. 이러한 경우에는 주석을 사용하여 명확하게 나타냅니다. 그러나 시작 튜토리얼에서 생성된 환경은 3D 환경입니다. 2D 환경에 대한 그래프를 만드는 방법에 대한 지침은 Pathfinding in 2D 를 참조하세요.

 

첫 번째로 해야 할 일은 경로를 계산하는 것입니다. 이를 위해 Seeker 컴포넌트의 StartPath 메서드를 사용합니다. Seeker에 대한 호출은 매우 간단합니다. 시작 위치, 종료 위치 및 콜백 함수(형식이 "void SomeFunction (Path p)"이어야 함) 세 가지 인수가 필요합니다:

Path StartPath (Vector3 start, Vector3 end, OnPathDelegate callback = null)

 

그러면 시작 시 경로 요청을 시작하는 간단한 코드 조각으로 스크립트를 시작해 보죠:

using UnityEngine;
using System.Collections;
// 다음 줄에 유의하세요. 이 줄이 빠지면 스크립트가 'Path' 클래스가 존재한다는 것을 알지 못하고 
// 컴파일러 오류가 발생할 것입니다.
// 이 줄은 항상 경로 찾기를 사용하는 스크립트의 맨 위에 있어야 합니다.
using Pathfinding;

public class AstarAI : MonoBehaviour {
    public Transform targetPosition;

    public void Start () {
        // 이전에 추가한 Seeker 컴포넌트에 대한 참조를 가져옵니다.
        Seeker seeker = GetComponent<Seeker>();

        // 새 경로를 계산하기 시작하고, 결과를 OnPathComplete 메서드에 반환합니다.
	// 경로 요청은 비동기적으로 이루어지기 때문에, OnPathComplete 메서드가 호출되는 시점은 
        // 경로를 계산하는 데 걸리는 시간에 따라 달라집니다.
	// 보통 다음 프레임에 호출됩니다.
        seeker.StartPath(transform.position, targetPosition.position, OnPathComplete);
    }

    public void OnPathComplete (Path p) {
        Debug.Log("야호, 경로를 받았어. 오류가 있었나요? " + p.error);
    }
}

 

프로젝트에서 AstarAI.cs라는 이름의 파일로 저장하고 AI GameObject에 스크립트를 추가합니다.
(-20,0,22)와 같은 좌표로 이동할 수 있는 새로운 GameObject를 만든 다음, AI GameObject를 선택하고 타겟을 targetPosition 필드로 드래그합니다. 이제 AI가 경로를 찾을 위치입니다.

재생을 누르세요. 로그 메시지를 확인해야 하며, 씬 뷰에 경로가 녹색 선으로 나타납니다 (Seeker 구성 요소는 마지막으로 계산된 경로를 Gizmos를 사용하여 그립니다).

녹색 선이 보이지 않으면 Seeker 구성 요소의 "Show Gizmos" 확인란이 선택되었는지 확인하세요. 최신 버전의 Unity에서는 gizmo를 깊이 테스트하므로 지면 아래에 숨겨져 있을 수 있습니다. 깊이 테스팅을 비활성화하려면 씬 뷰 창 위의 Gizmos 버튼을 클릭하고 "3D 아이콘" 확인란의 선택을 해제하세요.

에러가 발생하는 경우 Seeker 구성 요소가 실제로 AstarAI 스크립트가 있는 동일한 GameObject에 연결되어 있는지 확인하세요. 여전히 오류가 발생하면 대상 위치에 도달할 수 없을 수 있으므로 조금 변경해 보세요.

참고
이 페이지에서는 몇 가지 흔한 오류 메시지를 설명합니다: Error messages .

 

 

매끄럽지 않아 보이지만, 지금은 코드가 무엇을 했는지에 대한 설명을 기다리고 있을 수 있습니다.

먼저 스크립트는 Seeker의 StartPath 메서드를 호출합니다. 그런 다음 시커는 새 ABPath 인스턴스를 만들어 AstarPath 스크립트에 보냅니다. AstarPath 스크립트는 경로를 대기열에 넣습니다. 가능한 빨리 스크립트는 경로를 처리하고 그리드를 노드 단위로 검색하여 끝 노드가 찾아질 때까지 진행합니다.

검색 단계가 어떻게 작동하는지에 대한 자세한 정보는 이 위키피디아 페이지를 참조하세요.

 

경로가 계산되고 나면, 수정자가 첨부되어 있다면 수정자가 경로를 후처리한 후 Seeker에게 반환됩니다. 그런 다음 Seeker는 호출 시 지정된 콜백 함수를 호출할 것입니다.

계산된 경로를 받았을 때 어떻게 정보를 얻을 수 있을까요?

 

Path 인스턴스에는 이와 관련된 두 가지 목록이 있습니다. Path.vectorPath는 경로를 보유하는 Vector3 목록으로, 이 목록은 어떤 smoothing이 사용되더라도 수정될 것입니다. 이것은 경로를 얻는 권장되는 방법입니다. 두 번째로 Path.path 목록은 GraphNode 요소의 목록으로, 이 목록은 경로를 방문한 모든 노드를 보유하며, 통과한 경로에 대한 추가 정보를 얻는 데 유용할 수 있습니다.

 

먼저 항상 path.error를 확인해야 합니다. 이 값이 true이면 어떤 이유로든 경로가 실패한 것입니다. path.error가 true인 경우 Path.errorLog 필드에 무엇이 잘못되었는지에 대한 자세한 정보가 있습니다.

AI 스크립트를 확장하려면 이동을 추가해 보겠습니다.

 

3D 2D
우리는 Unity의 내장된 컴포넌트인 CharacterController를 사용하여 에이전트를 이동시킬 것입니다. 그러므로 AI GameObject에 CharacterController를 추가하세요. 우리는 에이전트를 간단히 Transform 컴포넌트의 위치를 수정하여 이동시킬 것입니다.

 

스크립트는 현재 이동 중인 경유지를 추적하고 거기에 근접하면 즉시 다음 경유지로 변경합니다.

매 프레임마다 우리는 몇 가지 작업을 수행할 것입니다:

  • 먼저 우리가 따라야 할 계산된 경로가 있는지 확인합니다. 경로 요청은 비동기적이기 때문에 경로가 계산되기까지 시간이 걸릴 수 있습니다(일반적으로 한 프레임).
  • 그런 다음 에이전트가 현재 이동 중인 경유지에 가까운지 확인하고, 그렇다면 다음 경유지로 전환하고 확인을 반복합니다.
  • 이동 방법을 계산하려면 현재 경유지의 좌표를 취하고 그것에서 우리의 위치를 뺍니다. 이렇게 하면 경유지를 향한 벡터가 얻어집니다. 이 벡터의 길이를 1로 만들어 정규화하면, 그렇지 않으면 경유지에서 멀어질수록 더 빨리 이동할 것입니다.
  • 그런 다음 그 벡터를 우리의 속도로 곱하여 속도를 얻습니다.
  • 마지막으로 CharacterController.SimpleMove 메서드를 사용하여 에이전트를 이동시킵니다(2D 게임을 만들고 있다면 transform.position을 수정합니다).
3D 2D
아래 스크립트는 3D 게임에 사용됩니다. 2D 게임에 아래 스크립트를 작동하도록 하려면 주석에서 'If you are writing a 2D game'를 찾고 필요한 변경 사항을 적용하십시오.

 

using UnityEngine;
// 이 줄에 주의하세요. 이 줄이 없으면 스크립트가 'Path' 클래스가 존재한다는 것을 알지 못하고 컴파일 오류가 발생합니다.
// 경로 찾기를 사용하는 스크립트의 맨 위에는 항상이 줄이 있어야 합니다.
using Pathfinding;

public class AstarAI : MonoBehaviour {
    public Transform targetPosition;

    private Seeker seeker;
    private CharacterController controller;

    public Path path;

    public float speed = 2;

    public float nextWaypointDistance = 3;

    private int currentWaypoint = 0;

    public bool reachedEndOfPath;

    public void Start () {
        seeker = GetComponent<Seeker>();
        // 만약 2D 게임을 개발 중이라면 이 줄을 삭제하고 
        // 아래에서 제안하는 대안적인 이동 방법을 사용해야 합니다.
        controller = GetComponent<CharacterController>();

        // 목표 지점으로 새 경로를 시작하고 경로가 계산되면
        // (복잡성에 따라 몇 프레임이 걸릴 수 있음) OnPathComplete 함수를 호출합니다.
        seeker.StartPath(transform.position, targetPosition.position, OnPathComplete);
    }

    public void OnPathComplete (Path p) {
        Debug.Log("A path was calculated. Did it fail with an error? " + p.error);

        if (!p.error) {
            path = p;
            // 웨이포인트 카운터를 재설정하여 경로의 첫 번째 지점으로 이동을 시작합니다.
            currentWaypoint = 0;
        }
    }

    public void Update () {
        if (path == null) {
            // 아직 따라갈 경로가 없으므로 아무 작업도 하지 마세요.
            return;
        }

        // 현재 웨이포인트에 충분히 가까운지 확인하여 다음 웨이포인트로 전환합니다.
	// 여러 웨이포인트가 서로 가까우면 같은 프레임에서 
        // 여러 웨이포인트에 도달할 수 있기 때문에 반복문을 사용합니다.
        reachedEndOfPath = false;
        // The distance to the next waypoint in the path
        float distanceToWaypoint;
        while (true) {
            // 최대 성능을 원한다면 제곱 거리를 확인하여 제곱근 계산을 제거할 수 있습니다.
            // 하지만 이는 이 튜토리얼의 범위를 벗어납니다.
            distanceToWaypoint = Vector3.Distance(transform.position, path.vectorPath[currentWaypoint]);
            if (distanceToWaypoint < nextWaypointDistance) {
                // 다음 웨이포인트가 있는지 또는 경로의 끝에 도달했는지 확인합니다.
                if (currentWaypoint + 1 < path.vectorPath.Count) {
                    currentWaypoint++;
                } else {
                    // 변수를 설정하여 에이전트가 경로의 끝에 도달했음을 나타냅니다.
                    // 이를 사용하여 게임에서 특별한 코드를 트리거할 수 있습니다.
                    reachedEndOfPath = true;
                    break;
                }
            } else {
                break;
            }
        }

        // 경로 끝에 접근할 때 부드럽게 속도를 줄입니다.
        // 이 값은 에이전트가 경로의 마지막 웨이포인트에 접근함에 따라 
        // 부드럽게 1에서 0으로 변경됩니다.
        var speedFactor = reachedEndOfPath ? Mathf.Sqrt(distanceToWaypoint/nextWaypointDistance) : 1f;

        // 다음 웨이포인트로의 방향입니다.
        // 길이가 1 월드 단위가 되도록 정규화합니다.
        Vector3 dir = (path.vectorPath[currentWaypoint] - transform.position).normalized;
        // 원하는 속도로 방향을 곱하여 속도를 얻습니다.
        Vector3 velocity = dir * speed * speedFactor;

        // CharacterController 구성 요소를 사용하여 에이전트를 이동합니다.
        // SimpleMove 메서드는 초당 미터 단위의 속도를 받기 때문에 
        // Time.deltaTime으로 곱하지 않아야 합니다.
        controller.SimpleMove(velocity);

        // 만약 2D 게임을 작성 중이라면 위의 CharacterController 코드를 제거하고 
        // 대신 다음 줄의 주석을 해제하여 직접 transform을 이동하면 됩니다.
        // transform.position += velocity * Time.deltaTime;
    }
}

 

지금 재생 버튼을 누르면 AI가 계산된 경로를 따라 이동합니다. 멋지죠?

원한다면 GameObject에 SimpleSmoothModifier를 추가하여 경로를 더 부드럽게 만들 수 있습니다. Modifier에 대한 자세한 내용은 Using Modifiers에서 확인할 수 있습니다.

 

 

여기서는 경로를 정기적으로 다시 계산하는 것과 같은 몇 가지 추가적인 개선을 찾을 수 있습니다:  AstarAI.cs.

이것으로 이 튜토리얼은 마무리됩니다. get started tutorial의 나머지 부분을 계속 진행하는 것을 권장합니다.

 

'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글

Using navmeshes > Automatically generating a navmesh  (0) 2024.05.20
Using navmeshes > Creating a navmesh manually  (0) 2024.05.20
Using navmeshes  (0) 2024.05.20
Installation Guide  (0) 2024.05.20
Get Started Guide  (0) 2024.05.20

 

설치 가이드

이 페이지에서는 패키지를 설치하는 방법을 보여 줍니다.

 

소개

Unity 에셋 스토어에서 패키지를 설치하거나 사용자 정의 패키지 관리자 레지스트리를 통해 패키지 웹사이트에서 패키지를 설치할 수 있습니다. 두 대안 모두 잘 작동하지만 사용자 정의 레지스트리는 (Unity가 패키지 관리자를 개선할 때까지) 좀 더 강력하며 이를 통해 패키지의 베타 버전에 액세스 할 수 있습니다.

 

  1. Unity 에셋 스토어에서 설치
  2. 패키지를 구매한 계정과 unity와 Unity Hub가 동일한지 확인하세요.
  3. 에셋 버전 4에서 업그레이드 하는 경우 충돌을 방지를 위해 업그레이드 전에 이전 버전(버전 4)의 설치를 삭제해야 합니다. 업그레이드 가이드에서 확인할 수 있습니다. 이전에 범위가 지정된 레지스트리를 통해 베타 버전을 설치한 경우 대신 해당 방법을 계속 사용할 수 있습니다.
  4. Unity의 Package Manager를 엽니다.

 

  1. 빨간 사각형1의 콤보박스에서'My Assets' 을 선택합니다.
  2. A* Pathfinding 프로젝트 패키지를 찾아서 클릭합니다.
  3. 에셋 패키지가 Unity에 다운되지 않았다면 빨강 사각형2에 'Download'가 표기 됩니다. 다운로드 하세요. 다운이 다 되면 'Import'를 해 줍니다.

 

  1. 'Import Unity Package' 창에서 'All'을 누른 후 'Import'를 누릅니다.

 

 

확인
'Import'를 하면 Unity의 'Packages'폴더에만 설치가 됩니다.

 

Example Scenes 가져오기

Example Scenes를 가져오는것도 좋지만, 아쉽게도 위의 방법만으론 가져올 수 없습니다.

 

에셋 패키지를 가져온후 'package Manager > In Project > A* Pathfinding Project > Samples > Import' 순으로 선택하여 Example Scenes를 가져옵니다.

 

확인
코드에 .asmdef 파일을 사용하는 경우 어셈블리 정의 참조 .

 

범위가 지정된 레지스트리를 통해 패키지를 사용하여 설치

패키지 웹 사이트를 통해 범위가 지정된 레지스트리를 사용하여 A* Pathfinding 프로젝트를 설치할 수도 있습니다. 이는 베타 버전에 액세스 하는 데 사용되며 이 방법을 사용하면 다른 버전의 패키지를 전환하는 것이 더 쉽습니다.

링크된 페이지의 지침에 따라 범위가 지정된 레지스트리를 프로젝트에 추가한 다음 package Manager를 사용하여 패키지를 설치할 수 있습니다. 패키지를 가져온 후에는 다른 작업을 수행할 필요가 없습니다.

선택적으로 Unity package Manager에서 예제 장면을 가져올 수 있지만, 기본적으로 가져오지 않습니다.

 

확인
코드에 .asmdef 파일을 사용하는 경우 어셈블리 정의 참조 .

 

어셈블리 정의 참조

프로젝트에서 Assmebly 정의 파일(. asmdef) 파일을 사용하는 경우 자체 코드에서 경로를 찾아 사용할 수 있도록 몇 가지 참조를 추가해야 합니다.

 

참고
.asmdef 파일에 대해 들어본 적이 없다면 해당 파일을 사용하고 있지 않을 것이므로 이 섹션을 건너뛰어도 됩니다.
 
  1. 코드에 사용하는 모든 .asmdef 파일을 찾으십시오. (단 A* Pathfinding에 포함되지 않거나 관계없는  파일 제외)
  2. "어셈블리 정의 참조" 섹션에서 "AstarPathfindingProject", "ALINE" 및 "PackageTools" 어셈블리를 참조로 추가합니다.
  3. 호환성 향상을 위해 "GUID 사용"을 활성화합니다.
  4. 적용을 클릭합니다.

 

설치 오류

 

패키지를 가져올 때 발생할 수 있는 오류 목록과 이를 해결하는 방법은 다음과 같습니다.

"Metadata file 'Library/PackageCache/com.unity.ext.nunit@1.0.6/net40/unity-custom/nunit.framework.dll' could not be found"

이 오류는 Unity 버그로 인해 발생합니다. Unity를 다시 시작하면 일반적으로 오류가 해결됩니다.

The type or namespace name 'Pathfinding' could not be found

패키지가 제대로 설치된 것 같으면 패키지를 사용하려고 할 때 자체 스크립트에서 이 문제가 발생할 수 있습니다. 이는 일반적으로 프로젝트에서 .asmdef 파일을 사용하기 때문에 발생합니다. 스크립트와 관련된 항목을 선택하고 AstarPathfindingProject 어셈블리를 참조로 추가해야 합니다.

 

참고
어셈블리 정의 참조 .

 

기타 오류

다른 오류가 발생하는 경우 다음을 시도해 보는 것이 좋습니다.

  • 지원되는 Unity 버전을 사용하고 있는지 확인하세요.
  • 종속성이 제대로 설치되었는지 확인하세요.
  • 패키지를 삭제하고 다시 설치해보세요.
  • 유니티를 다시 시작하세요.

 

A* Pathfinding 프로젝트 시작하기

Pathfinding은 A 지점에서 B 지점까지 최적의 경로를 찾는 것입니다. A* Pathfinding 프로젝트는 이를 수행합니다. 이 튜토리얼에서는 새 장면에 프로젝트를 설정하고, 장애물을 피하면서 간단한 AI를 이동시키는 방법을 배웁니다.

 

이 튜토리얼에서 작성할 AI는 매우 고급스럽지 않으며, 이동하고 경로를 따르는 데 필요한 최소한의 코드만 포함합니다. 더 고급 AI를 원한다면, 이 튜토리얼에서 작성한 스크립트를 확장하거나 패키지에 포함된 AIPath 또는 RichAI 스크립트를 사용하거나 확장할 수 있습니다 (RichAI 컴포넌트의 기본 사용법은 2부를 참조하세요).

 

설치

먼저, A* Pathfinding 프로젝트를 다운로드하세요 (아직 하지 않았다면).

설치 가이드는 여기를 참조하세요: [설치 가이드](링크).

프로젝트는 여기에서 다운로드할 수 있습니다. 기능이 제한된 무료 버전(하지만 여전히 매우 강력함)과 더 많은 기능이 포함된 프로 버전을 구매할 수 있습니다.

원한다면, 다음 섹션을 시작하기 전에 프로젝트의 다양한 예제 장면을 탐색할 수 있습니다. 패키지를 설치하는 방법에 따라 Unity 패키지 관리자에서 예제 장면을 별도로 가져와야 할 수도 있습니다.

 

참조
Example Scenes

 

개요

패키지는 여러 가지 부분으로 나뉩니다. 크게 다음과 같이 그룹화할 수 있습니다:

 

  • 이동 스크립트: 에이전트가 어떻게 이동하고 어디로 이동해야 하는지 알려줍니다 (참조: Movement scripts ).
  • 그래프: 에이전트가 이동할 수 있는 영역을 설명합니다 (참조:  Graph Types ).
  • 임시 장애물: 네비메쉬에 구멍을 내거나 다른 방법으로 업데이트합니다 (참조:  Graph Updates ).
  • 오프-메쉬 링크: 에이전트가 네비메쉬의 분리된 부분 사이를 이동하거나 점프할 수 있게 합니다 (참조: NodeLink2 ).
  • 경로 수정자: 경로를 후처리하여 매끄럽게 만드는 등의 작업을 합니다 (참조: Using Modifiers ).

주로 상호작용할 것은 이동 스크립트와 Seeker 컴포넌트입니다. 둘 다 이동해야 하는 에이전트에 부착되어야 합니다. 이동 스크립트는 에이전트의 이동 방식, 속도, 회전 등을 제어하며, 에이전트의 현재 목적지 및 경로를 다시 계산해야 하는 시점 등을 조절합니다. Seeker 컴포넌트는 이동 스크립트에 의해 제어됩니다. 이동 스크립트는 경로를 계산하도록 Seeker에게 알립니다. 그리고 Seeker는 이동 스크립트로 결과를 반환할 것입니다.

 

AstarPath 컴포넌트는 장면 내의 모든 그래프 데이터를 보유합니다. 이는 싱글톤 패턴을 따르므로 장면 내에는 한 개의 이러한 컴포넌트만 있어야 합니다. AstarPath는 동일한 유형 또는 다른 유형의 하나 이상의 그래프를 포함할 수 있습니다. 각 그래프는 다시 여러 개의 노드를 포함하고 관리합니다 (이 중 일부는 수백만 개가 될 수도 있습니다).

 

패키지에는 AIPath, RichAI, AILerp, FollowerEntity와 같은 여러 이동 스크립트가 포함되어 있습니다. 이 중 하나를 사용하거나 직접 작성할 수 있습니다 (이동 스크립트 작성을 참조하세요). 내장된 이동 스크립트의 비교는 여기에서 찾을 수 있습니다: Movement scripts .

 

비디오 튜토리얼

만약 텍스트 튜토리얼 대신 비디오 튜토리얼을 선호한다면 여기 비디오가 있습니다. 비디오 튜토리얼은 보다 고수준의 접근 방식을 취하며, 사용자 정의하는 대신 내장된 이동 스크립트를 사용하는 방법을 배우게 됩니다. 비디오와 텍스트 튜토리얼이 약간 다른 내용을 다루기 때문에 둘 다 살펴보는 것이 나쁘지 않은 생각입니다.

Unity Cookie의 게이브리얼 윌리엄스가 제공한 훌륭한 튜토리얼도 참고하실 수 있습니다. 이는 타워 디펜스 게임 제작 시리즈의 8부에 해당합니다: [링크](https://www.youtube.com/watch?feature=player_embedded&v=PUJSvd53v4k). 해당 비디오는 텍스트 튜토리얼에서 다룰 대부분의 내용을 다룹니다.

 

새로운 장면

새로운 장면을 만들고 "PathfindingTest"라고 이름 짓습니다. 이제 AI가 걸을 수 있는 무언가를 만들고 피할 것을 만들어 봅시다: 장면에 평면을 추가하고, 장면 원점(0,0,0)에 배치하고 크기를 10,10,10으로 조정합니다.

"Ground"라는 새 레이어를 만들고 장면에 평면을 이 레이어에 배치합니다. 이제 다른 크기의 몇 개의 큐브를 만들고 이를 평면 위에 배치합니다. 이것들은 AI가 피해야 할 장애물이 될 것입니다. 이들을 "Obstacles"라는 새 레이어에 배치합니다.

이제 장면이 이렇게 보일 것입니 다:

 

A* 추가

이제 AI가 서 있을 수 있는 땅과 피해야 할 장애물이 있습니다. 따라서 이제 경로 탐색을 가능하게 하기 위해 장면에 A* Pathfinding 시스템을 추가하겠습니다.

새 GameObject를 만들고 "A*"이라고 이름 짓고, 그에 "AstarPath" 컴포넌트를 추가합니다 (메뉴 바 → Components → Pathfinding → AstarPath).

AstarPath 인스펙터는 여러 부분으로 나뉩니다. 가장 중요한 두 부분은 Graphs 영역과 하단에있는 Scan 버튼입니다. Graphs 영역에는 장면의 모든 그래프가 포함되어 있습니다. 최대 256개까지 보유할 수 있지만 일반적으로 1개 또는 2개가 충분합니다. 단일 그래프가 일반적으로 간단함을 위해 선호됩니다.

Graphs 영역을 클릭하여 열면 추가할 수있는 그래프 목록이 표시됩니다. 이 튜토리얼에서는 그리드 패턴의 노드를 생성하는 GridGraph를 생성합니다.

 

참고:
Graph Types 에서 다양한 그래프 유형에 대해 더 많은 정보를 읽을 수 있습니다.

 

그리드 그래프를 추가한 후에는 해당 레이블을 클릭하여 그래프 설정을 표시합니다.

인스펙터 하단에는 "Scan"이라는 버튼이 있습니다. 이 버튼은 설정 및 세계에 따라 그래프를 계산하는 데 사용됩니다. 설정을 변경한 후에는 변경 사항을 보려면 그래프를 스캔해야 합니다. 이 작업에 대한 편리한 단축키가 있습니다: Cmd+Alt+S(mac) 또는 Ctrl+Alt+S(windows).

게임이 시작될 때 모든 그래프가 기본적으로 스캔됩니다(시작이 캐시된 경우를 제외하고, 이에 대한 자세한 내용은 다른 부분에서 설명합니다).

그리드 그래프는 이름에서 암시하는 대로 width*depth size 의 노드 그리드를 생성합니다. 그리드는 장면의 어디에나 위치시킬 수 있으며 원하는대로 회전시킬 수 있습니다.

노드 크기 변수는 그리드 내의 정사각형/노드의 크기를 결정합니다. 이 튜토리얼에서는 이 값을 1로 설정하여 노드 사이의 간격을 1 유닛으로 유지합니다.

그러나 위치를 변경해야 합니다. 위치 필드 오른쪽의 작은 선택기에서 bottom-left로 변경한 다음 (-50, -0.1, -50)을 입력하십시오. -0.1은 부동 소수점 오류를 피하기 위한 것입니다. 장면의 지면이 Y = 0에 있으므로 그래프의 위치도 Y = 0이어야 합니다. 그렇지 않으면 예를 들어 광선을 캐스트 할 때 부동 소수점 오류가 발생할 수 있습니다 (높이 체크와 같이).

그리드를 장면에 맞추려면 너비와 깊이 변수를 변경해야 합니다. 이 경우에는 둘 다 100으로 설정하십시오. 장면 뷰의 흰색 경계 사각형이 지면을 정확히 둘러싸고 있음을 볼 수 있습니다.

 

Height Testing

노드를 올바른 높이에 배치하기 위해 A* 시스템은 장면에 대해 여러 개의 광선을 발사하여 광선이 어디에서 충돌하는지 확인합니다. 이것이 높이 테스트 설정입니다. [광선 길이] 단위 위에서 아래로 광선이 발사되고, 광선이 충돌하는 곳에 노드가 배치됩니다. 만약 아무 것도 충돌하지 않으면, 만약 "Unwalkable When No Ground" 변수가 토글되어 있으면 걷기 불가능한 지점으로 만들거나, 그렇지 않으면 노드가 그리드에 대해 Y = 0 위치에 배치됩니다.

높이 테스트가 올바른 대상에 충돌하는지 확인하려면 사용되는 마스크를 변경해야 합니다. 현재 모든 것이 포함되어 있지만, 이는 우리의 장애물도 포함될 것입니다. 이것은 우리가 원하지 않습니다. 따라서 마스크를 이전에 만든 "Ground" 레이어만 포함하도록 설정하십시오.

 

Collision Testing

노드가 배치된 후 걷기 가능 여부가 확인됩니다. 이는 구, 캡슐 또는 광선을 사용하여 수행될 수 있습니다. 일반적으로 캡슐이 사용되며, 선호하는 경우 AI 캐릭터와 동일한 지름과 높이를 가지며, 가능한 한 여유 있게 설정됩니다.

우리의 AI는 각각 1과 2의 표준 지름과 높이를 가질 것입니다. 그러나 충돌 테스트를 위한 지름과 높이를 2와 2로 설정하여 여유를 얻을 것입니다.

다음으로 우리가 배치한 장애물을 시스템이 인식하도록 하려면 충돌 테스트를 위한 마스크를 변경해야 합니다. 이번에는 "Obstacles" 레이어만 포함하도록 설정하십시오. 우리의 지면이 장애물로 처리되기를 원하지 않기 때문입니다.

이제 모든 것이 올바르게 설정되었으므로 Scan 버튼을 누를 수 있습니다. 잠시 기다리면 생성된 그리드가 나올 것입니다! (모든 것을 올바르게 수행했다면 그렇습니다. 설정을 아래 이미지와 비교하여 Show Graphs가 true인지 확인하십시오).

 

AI 추가하기

경로 찾기 테스트는 움직이는 요소가 없으면 재미가 없습니다. 그래서 AI를 추가하여 테스트해보겠습니다.

캡슐을 생성하고 Character Controller 컴포넌트를 추가한 후, 평면 위에서 보이는 위치에 배치합니다.

AI에 Seeker 컴포넌트를 추가합니다. 이 스크립트는 다른 스크립트에서 경로 요청을 호출하는 보조 스크립트로, 경로를 부드럽게 하거나 레이캐스트를 사용하여 단순화하는 등의 경로 수정자를 처리할 수도 있습니다.

이제 두 가지 대안이 있습니다. 직접 움직임 스크립트를 작성하거나 내장된 움직임 스크립트를 사용할 수 있습니다. 포함된 스크립트는 튜토리얼에서 작성하는 것보다 훨씬 고급이므로 대부분의 경우 이를 사용하는 것이 좋습니다. 그러나 시스템의 작동 방식을 이해하는 데 도움이 되므로 사용자 정의 움직임 스크립트 작성을 위한 튜토리얼을 따르는 것을 추천합니다.

튜토리얼 하위 페이지를 확인하세요:  Writing a movement script .

포함된 스크립트는 AIPath, RichAI 및 AILerp입니다. AIPath와 AILerp 스크립트는 모든 그래프에서 사용할 수 있으며, RichAI는 주로 내브메쉬 기반 그래프에 사용됩니다. AIPath와 RichAI 스크립트는 경로를 느슨하게 따르지만, AILerp 스크립트는 보간을 사용하여 경로를 매우 정확하게 따라가지만, 실제처럼 보이지는 않을 수 있습니다. 어떤 것을 사용할지는 게임에 따라 다릅니다.

 

참고
포함된 움직임 스크립트에 대한 자세한 정보는 Movement scripts 페이지를 참조하세요. 또한, 포함된 예제 씬에서 이러한 스크립트가 어떻게 사용되는지 확인할 수 있습니다.

 

이 튜토리얼에서는 AI에 AIPath 컴포넌트를 추가할 수 있습니다. 또한, "Target"이라는 이름의 새로운 GameObject를 생성하고 AI가 이동할 위치에 배치합니다. 그런 다음 AI에 AIDestinationSetter 컴포넌트를 추가합니다. 이 컴포넌트는 AIPath 스크립트에 특정 위치로 이동하도록 지시하는 매우 간단한 헬퍼 스크립트입니다. 나중에 이 스크립트를 게임에 맞게 직접 작성한 스크립트로 교체할 가능성이 높습니다. AIDestinationSetter 컴포넌트에는 "target"이라는 단일 필드가 있으며, 여기에 앞서 생성한 "Target" GameObject를 할당합니다.

이제 재생 버튼을 누르면 AI가 목표 지점으로 이동해야 합니다. 움직임 스크립트가 어떻게 작동하고 어떻게 설정하는지에 대한 자세한 내용은 위에 링크된 비디오 튜토리얼에서 설명하고 있습니다. 무언가 제대로 작동하지 않는 경우 해당 비디오를 참조하세요.

 

Smoothing

이제 간단한 그리드 그래프를 설정하고 경로를 계산하는 방법을 배웠습니다. 하지만 경로를 조금 더 매끄럽게 만들 방법이 분명 있을 것입니다.
물론입니다. 경로를 부드럽게 하고 단순화하는 스크립트는 Path Modifiers라고 하며, Seeker와 동일한 GameObject에 추가할 수 있는 스크립트입니다.

가장 간단한 것은 Simple Smooth Modifier로, 이는 메뉴 바 → Components → Pathfinding → Modifiers → Simple Smooth에서 찾을 수 있습니다. 이를 우리의 AI에 추가하세요.

이 수정자는 경로를 여러 번 세분화하여 각 세그먼트가 Max Segment Length 변수보다 작아질 때까지 경로를 세분화한 후, 포인트를 서로 더 가깝게 이동시켜 경로를 부드럽게 할 것입니다. 수정자에는 여러 설정이 있으며, 여기서 모든 것을 설명하지는 않겠습니다. 각 변수에 대한 자세한 내용은 SimpleSmoothModifier 문서를 참조하세요. 이 튜토리얼에서는 Max Segment Length를 1로, Iterations를 5로, Strength를 0.25로 설정할 수 있습니다. 좋은 값을 찾기 위해 실험해 보세요.

이제 다시 재생 버튼을 누르면 경로가 훨씬 부드러워져 우리가 원하던 대로 보일 것입니다.

 

경고
Smoothers는 일반적으로 월드 지오메트리나 그래프를 고려하지 않으므로 너무 많은 평활화를 적용할 경우 경로가 통행 불가능한 지역을 지나갈 수 있습니다. 따라서 평활화를 적용할 때는 주의해야 합니다.

또 다른 유용한 수정자는  FunnelModifier 로, 경로를 크게 단순화할 수 있습니다. 이 수정자는 navmesh/recast 그래프를 사용할 때 거의 항상 사용됩니다.

수정자에 대한 자세한 내용은 Using Modifiers 페이지를 참조하십시오.

 

Logging settings

시스템에서 경로를 계산할 때마다 선택적으로 콘솔에 로깅할 수 있습니다. 이는 시스템이 무엇을 하고 있는지 이해하고 성능 문제를 발견하는 데 큰 도움이 됩니다. 하지만 로깅은 무료가 아니므로 릴리스 빌드에서는 비활성화하는 것이 좋습니다.

로깅 설정은 A* Inspector → Settings → Debug 탭에서 변경할 수 있습니다.

성능을 약간 개선하거나 콘솔 로그를 줄이려면 디버깅을 적게 사용하세요. 경로 찾기 스크립트가 무엇을 하는지에 대한 자세한 정보를 원한다면 디버깅을 많이 사용하세요. InGame 옵션을 사용하면 게임 내 GUI를 사용하여 최신 경로 로그를 표시합니다.

 

결론

이것으로 시작하는 튜토리얼 파트 1이 마무리되었습니다. 이것으로부터 무엇인가를 배워주길 바랍니다. 여기서부터는 나머지 문서를 탐색하거나 프로젝트에 직접 참여할 수 있습니다. 약간 더 나은 AI를 원한다면 프로젝트에 포함된 AIPath 스크립트를 사용할 수 있습니다.

다음 시작 튜토리얼 파트인 navmesh 그래프를 사용하는 부분으로 계속 진행할 수 있습니다: Using navmeshes

또한 사이드바를 살펴보면 이 패키지 사용에 대한 여러 튜토리얼을 찾을 수 있습니다.

행운을 빕니다!

+ Recent posts