Using navmeshes
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도 낮출 수 있습니다.