Recast graph in a 3D game
3D 레벨에서 Recast 그래프를 시연하는 예제 장면
이 예제 장면은 3D 게임에서 Recast 그래프를 사용하는 방법을 시연합니다. 또한 Interactable 컴포넌트를 사용하여 간단한 상호작용 객체를 만드는 방법을 시연하며, 오프-메시 링크와 NavmeshCut 컴포넌트를 사용하여 Recast 그래프에 동적 장애물을 만드는 방법을 포함하고 있습니다.
장면에는 하나의 에이전트가 있으며, 바닥을 클릭하여 이동시킬 수 있습니다. "P" 키를 누르면 작은 상자가 바닥에 떨어지는 형태의 동적 장애물을 생성할 수 있습니다.
목차
Graph setup
- 이 장면에서 사용된 그래프는 RecastGraph입니다. Recast 그래프가 선택된 이유는 다음과 같습니다:
- 이 장면에 존재하는 돌출부와 다리를 지원하기 때문입니다.
- 필요한 수준의 디테일을 쉽게 표현할 수 있기 때문입니다.
이 장면에 존재하는 동적 장애물을 높은 정밀도로 쉽게 지원할 수 있기 때문입니다.
이 장면에는 계층화된 그리드 그래프도 사용할 수 있었습니다. 하지만 동적 장애물을 잘 표현하려면 더 높은 수준의 디테일이 필요했을 것입니다. 이 장면은 계층화된 그리드 그래프가 제공하는 세밀한 태그와 페널티 지원의 이점을 누리지 못하며, 세계 자체가 그리드 기반이 아니기 때문에 Recast 그래프가 더 적합합니다.
Chests
이 예제 장면에는 플레이어가 클릭하여 열 수 있는 몇 개의 상자가 포함되어 있습니다.
이 상자들은 Interactable 컴포넌트를 사용하여 상자의 애니메이션과 캐릭터의 움직임을 제어하는 간단한 상태 기계를 구현합니다.
참고 Interactable 컴포넌트는 예제 장면을 위한 매우 간단한 상태 기계 구현입니다. 실제 게임에서는 더 고급 상태 기계 구현을 사용하는 것이 좋지만, 이 스크립트는 게임용 상태 기계 코드를 작성하려는 경우 좋은 예제가 될 수 있습니다. |
메인 카메라에 있는 TargetMover 컴포넌트는 플레이어가 상호작용 가능한 객체를 클릭했는지 감지하고, 클릭 시 상호작용을 시작하는 코드를 포함하고 있습니다. 이 경우, 상호작용 객체는 다음 단계를 수행하도록 구성되어 있습니다:
- 플레이어가 바닥의 어느 곳을 클릭했을 때와 동일한 "여기로 이동" 파티클 효과를 생성합니다.
- 에이전트를 상자로 이동시키고, 상자를 향해 회전시킵니다.
- 상자 열기 애니메이션을 재생하고, 일부 파티클 효과를 생성합니다.
Off-mesh link
맵의 한 구석에는 에이전트가 뛰어내릴 수 있는 절벽이 있습니다. 이는 NodeLink2 컴포넌트를 사용하여 구현되었습니다.
오프-메시 링크는 일반적으로 연결되지 않은 내비메시의 두 부분을 연결합니다. 이들은 절벽에서 뛰어내리기, 사다리 오르기, 문 열기 등의 동작에 사용됩니다.
이 오프-메시 링크는 절벽 상단의 시작 지점과 절벽 하단의 끝 지점으로 구성되어 있습니다. 링크는 또한 에이전트가 절벽을 뛰어올라가려 하지 않도록 단방향으로 설정되어 있습니다. 에이전트가 절벽을 뛰어내리는 대신 돌아서 가도록 유도하기 위해 비용 계수는 2로 설정되었습니다. 비용 계수가 1이면 링크를 통해 이동하는 비용이 정상적인 내비메시에서 같은 거리를 이동하는 것과 동일하다는 의미입니다.
NodeLink2.costFactor 참조 |
Off-mesh links 참조 |
Navmesh cutting
게임 모드에서 "P" 키를 누르면 작은 상자가 땅에 떨어지는 형태의 동적 장애물이 생성됩니다. 이 장애물은 NavmeshCut 컴포넌트를 사용하여 내비메시에 영향을 줍니다.
Recast/Navmesh 그래프에서 내비메시 컷팅은 타일을 처음부터 다시 계산하는 것보다 상당히 빠릅니다. 그러나 새로운 부분을 추가할 수 없고, 내비메시의 일부만 제거할 수 있기 때문에 약간 제한적입니다. 결과 내비메시는 처음부터 다시 계산한 것만큼 좋지는 않지만, 대부분의 게임에서는 동적 장애물에 대해 내비메시 컷팅이 훌륭한 해결책입니다.
상자에 대한 내비메시 컷은 큐브를 근사한 반경을 가진 구 형태로 구성되어 있습니다. 해상도가 6일 때, 내비메시 컷은 내비메시에서 육각형 모양을 제거합니다. "박스" 형태로 구성할 수도 있었지만, 구 형태가 약간 더 간단하고, 둥근 모양이 상자 주위의 이동을 더 부드럽게 만듭니다.
Navmesh Cutting 참조 |
Character animation
캐릭터 애니메이션은 MineBotAnimation 스크립트에 의해 처리됩니다.
이 스크립트는 다음 애니메이터 파라미터를 사용하여 이동 속도를 애니메이터 컴포넌트로 전달합니다:
NormalizedSpeed: 세계 단위로 측정된 이동 속도를 MineBotAnimation.naturalSpeed 및 캐릭터의 스케일로 나눈 값입니다. 에이전트가 자연 속도로 이동할 때는 1이 되고, 정지해 있을 때는 0이 됩니다.
애니메이터 컨트롤러에서 루트에는 두 가지 상태가 있습니다: forward와 idle. 이는 두 개의 애니메이션 클립으로, NormalizedSpeed가 충분히 높은지 여부에 따라 전환됩니다. forward 애니메이션 클립은 NormalizedSpeed 파라미터에 의해 속도가 곱해지도록 설정되어 있어, 에이전트의 이동 속도에 따라 애니메이션이 빠르거나 느리게 재생됩니다.