▣ Navigation (Obsolete)
Navigation (Obsolete)는 Unity에서 오래된 네비게이션 시스템으로, 더 이상 유지 보수가 되지 않고 새로운 시스템으로 대체되었거나 개선된 시스템이 있습니다. Obsolete라는 의미는 더 이상 권장되지 않는 기능이나 API라는 뜻으로, 향후 업데이트에서 제거될 수 있음을 의미합니다.
Navigation (Obsolete)는 유니티의 초기 네비게이션 시스템으로, 오래된 방식의 NavMesh 생성 및 설정을 제공합니다. 이는 간단한 AI 경로 탐색을 구현할 수 있지만, 최신 시스템에 비해 기능이 제한적이며, 확장성이나 유연성이 떨어집니다.
주요 특징
단순한 NavMesh 생성 및 AI 경로 탐색 기능 제공.
몇 가지 기본적인 경로 탐색 기능만 지원.
복잡한 환경에서의 유연성 부족 (예: 여러 Agent Type 관리, 동적 장애물 처리 등이 미흡).
▣ Navigation (현재 시스템)
유니티의 Navigation (AI Navigation) 시스템은 최신 네비게이션 기능을 제공하며, 기존 Navigation (Obsolete) 시스템을 대체하는 기능입니다. 이 시스템은 NavMesh Components 패키지나 AI Navigation 패키지로 확장되며, 좀 더 유연하고 다양한 기능을 제공하여 AI가 복잡한 환경에서 경로를 탐색할 수 있게 합니다.
주요 특징
NavMesh Surface: 하나의 NavMesh가 아닌 여러 NavMesh를 다루거나 특정 영역에만 NavMesh를 적용할 수 있는 기능.
NavMesh Agent: AI 캐릭터의 경로 탐색과 관련된 많은 설정(속도, 회전 속도, 가속도 등)을 세밀하게 제어 가능.
NavMesh Obstacle: 동적으로 장애물을 설정할 수 있으며, 장애물 주위로 AI가 경로를 우회할 수 있게 처리.
NavMeshLink: 서로 다른 NavMesh 영역을 연결하는 링크를 생성하여 AI가 다른 NavMesh 간 이동 가능.
여러 Agent Type 지원: 다양한 캐릭터 유형(예: 인간형, 차량형 등)에 맞게 각기 다른 경로 탐색을 할 수 있음.
동적 NavMesh 업데이트: 실시간으로 NavMesh를 동적으로 수정 및 갱신할 수 있어, 동적인 게임 환경에서 더 유연하게 대응 가능.
▣ NavMeshSurface는 NavMesh를 생성하고 관리하는 데 사용되는 새로운 컴포넌트입니다. 최신 AI Navigation 시스템을 사용하려면, Ground 또는 캐릭터가 이동할 수 있는 바닥 오브젝트에 NavMeshSurface 컴포넌트를 추가하는 것이 필요합니다. 이 컴포넌트를 통해 NavMesh를 설정하고, 생성할 수 있습니다.
NavMeshSurface 컴포넌트 추가 및 설정 방법
Ground 오브젝트 선택: 이동 가능한 표면(예: 바닥, 지형)을 선택합니다.
Ground는 플레이어와 AI 캐릭터가 이동할 수 있는 영역이어야 합니다.
NavMeshSurface 컴포넌트 추가:
Inspector 창에서 Add Component 버튼을 클릭합니다.
검색 창에 NavMeshSurface를 입력하고 선택하여 추가합니다.
NavMeshSurface 설정:
Agent Type: 기본적으로 Humanoid가 선택되어 있으며, 이는 인간형 AI 캐릭터에 맞게 설정된 값입니다. 다른 유형의 캐릭터가 있다면 적절한 에이전트 타입으로 변경할 수 있습니다.
Include Layers: NavMesh에 포함시킬 레이어를 지정할 수 있습니다. 기본적으로 모든 레이어가 포함되지만, 특정 레이어만 포함하려면 해당 설정을 수정할 수 있습니다.
Use Geometry: NavMesh를 생성할 때 어떤 지오메트리(즉, 메쉬나 콜라이더)를 사용할지 선택할 수 있습니다. 보통 기본 설정으로 두는 것이 좋습니다.
1. Agent Type
이 옵션은 네비게이션 메시(NavMesh)를 생성할 때 사용할 에이전트의 유형을 선택합니다. Unity에서는 기본적으로 Humanoid라는 기본 에이전트 타입이 설정되어 있습니다.
예를 들어, 좀비 AI 같은 캐릭터가 네비게이션 메시에서 걷기 위한 설정이 Humanoid일 수 있습니다.
이 외에도 여러 다른 에이전트 타입을 생성할 수 있으며, 각 타입은 서로 다른 크기와 경로 탐색 규칙을 가질 수 있습니다.
2. Include Layers
NavMesh를 생성할 때 어떤 레이어의 오브젝트가 NavMesh에 포함될지 결정합니다.
예를 들어, 특정 레이어에 속한 Terrain 또는 지형 오브젝트만 NavMesh에 포함하고 싶다면 이 레이어를 선택합니다.
선택된 레이어에 속한 오브젝트만 NavMesh 생성에 영향을 미치게 됩니다.
3. Default Area
기본 영역으로 설정된 값으로, 이 영역에서 에이전트가 이동할 때 적용되는 기본적인 경로 탐색 비용을 결정합니다.
Unity에서는 여러 NavMesh Area(예: Walkable, Not Walkable, Jump) 등을 설정할 수 있는데, 이 Default Area는 이 영역 중에서 기본적인 걷기 영역(Walkable)을 지정할 수 있습니다.
이를 통해 NavMesh를 걷는 기본 영역을 설정하게 됩니다.
4. Generate Links
Auto Links를 자동으로 생성할지 여부를 결정하는 옵션입니다. Link는 네비게이션 메시에서 서로 다른 높이에 있는 NavMesh 간의 경로를 연결하는 역할을 합니다.
이를 활성화하면, 높이가 다른 두 지점 간의 경로를 에이전트가 이동할 수 있도록 자동으로 링크를 생성합니다. 예를 들어, 계단, 경사로, 장애물을 넘어서 이동할 수 있게 만듭니다.
이 기능을 사용하면 에이전트가 점프나 이동 연결이 필요한 곳에서도 네비게이션 메시를 통해 이동할 수 있습니다.
5. Override Tile Size
NavMesh 타일의 크기를 직접 설정할 수 있습니다.
일반적으로는 Unity가 자동으로 타일 크기를 계산하지만, 타일 크기를 수동으로 설정하려는 경우 이 옵션을 사용할 수 있습니다.
타일 크기를 조정함으로써 NavMesh가 더 정밀하게 생성되거나 더 효율적으로 사용될 수 있습니다.
6. Override Voxel Size
Voxel은 NavMesh를 생성할 때 사용하는 3D 그리드의 해상도입니다. 이 옵션을 활성화하면 Voxel 크기를 수동으로 조정할 수 있습니다.
Voxel 크기가 작을수록 더 정밀한 NavMesh가 생성되지만, 계산 비용이 증가합니다. 반대로, 크기를 크게 하면 계산 비용은 줄어들지만 NavMesh의 정확도가 떨어질 수 있습니다.
필요한 경우 이 값을 조정하여 NavMesh의 세밀함을 컨트롤할 수 있습니다.
7. Build Height Mesh
NavMesh에서 높이 데이터를 포함할지 여부를 설정합니다.
이 옵션을 켜면, 생성된 NavMesh가 높이에 대한 정보를 포함하게 됩니다. 이를 통해 경로 계산 시 높이 변화가 더 정확하게 반영됩니다.
주로 높낮이가 있는 지형에서 더 정밀한 경로 탐색을 원할 때 사용됩니다.
요약:
Agent Type: NavMesh에서 사용하는 에이전트 유형을 설정합니다.
Include Layers: NavMesh에 포함할 레이어를 선택합니다.
Default Area: NavMesh의 기본 영역(걷기 가능한 영역)을 설정합니다.
Generate Links: 자동으로 높낮이 간의 링크를 생성하여 경로 연결을 돕습니다.
Override Tile Size: NavMesh의 타일 크기를 수동으로 설정합니다.
Override Voxel Size: NavMesh의 세밀한 해상도를 수동으로 설정할 수 있습니다.
Build Height Mesh: NavMesh에 높이 정보를 포함시켜, 더 정밀한 경로 탐색을 가능하게 합니다.
Bake NavMesh:
설정이 완료되면 NavMeshSurface 컴포넌트 아래에 있는 Bake 버튼을 클릭하여 NavMesh를 생성합니다.
NavMesh가 정상적으로 생성되면 씬 뷰에서 파란색으로 경로가 표시됩니다.
▣ NavMeshAgent 컴포넌트는 Unity의 네비게이션 시스템을 통해 캐릭터가 경로 탐색을 할 수 있도록 해주는 컴포넌트입니다. 이 컴포넌트는 캐릭터가 NavMesh 위에서 목표 지점으로 이동할 수 있도록 관리합니다.
1. Agent Type
설명: Agent Type은 NavMesh에서 사용할 에이전트의 유형을 설정합니다. 에이전트는 캐릭터의 크기와 이동 규칙을 정의하는 역할을 합니다.
용도: 서로 다른 크기와 이동 규칙을 가진 여러 종류의 캐릭터를 네비게이션에서 사용할 수 있습니다. 예를 들어, Humanoid 타입은 사람형 캐릭터에 적합한 속성과 크기를 가집니다.
설정:
Humanoid: 사람형 캐릭터에 맞는 기본 에이전트 설정(사람의 평균 크기와 속도).
새로운 에이전트 타입을 추가하여 캐릭터의 크기나 속도를 맞출 수 있습니다.
2. Base Offset
설명: Base Offset은 NavMesh와 에이전트의 기본 위치 사이의 **수직 오프셋(높이 차이)**를 설정하는 값입니다. 이는 에이전트의 기준 위치가 실제 캐릭터의 물리적 위치와 어느 정도의 차이가 있는지를 결정합니다.
용도:
에이전트가 NavMesh와의 수직 위치를 조정할 수 있습니다. 특히, 캐릭터가 NavMesh 표면에서 너무 떠 있는 것처럼 보이거나 너무 내려간 것처럼 보일 때 이 값을 조정합니다.
예를 들어, 에이전트의 중심이 발 밑이 아니라 가슴이나 허리 부근에 있을 경우, NavMesh와의 기준점을 조정해야 할 수 있습니다.
예시:
Base Offset = 0: 에이전트가 NavMesh에 바로 맞닿아 있는 상태.
Base Offset > 0: 에이전트가 NavMesh에서 더 높이 위치한 상태.
Base Offset < 0: 에이전트가 NavMesh 아래쪽에 위치한 상태.
3. Steering (조향 설정)
Steering 설정은 에이전트가 목표 지점을 향해 이동할 때 경로를 따라 방향을 어떻게 전환하고 조정하는지에 대한 설정입니다. 회전 속도, 멈춤 거리, 가속도 등 이동의 세부적인 동작을 설정할 수 있습니다.
A. Speed
설명: 에이전트가 목표 지점으로 이동할 때의 최대 속도를 설정합니다.
용도: 에이전트가 얼마나 빠르게 움직이는지 결정하는 값입니다. 예를 들어, 좀비나 NPC가 빠르게 움직이는지 천천히 움직이는지를 설정할 수 있습니다.
예시:
Speed = 3.5: 에이전트는 초당 3.5 미터의 속도로 이동합니다.
B. Angular Speed
설명: 에이전트가 목표 지점을 향해 회전할 때의 회전 속도를 나타냅니다. 값이 높을수록 에이전트는 빠르게 방향을 바꿉니다.
용도: 에이전트가 경로를 따라 이동할 때 방향을 얼마나 빠르게 전환하는지 결정합니다. 캐릭터가 부드럽게 회전하거나 급격히 방향을 틀도록 설정할 수 있습니다.
예시:
Angular Speed = 120: 에이전트는 초당 120도 회전할 수 있습니다. 값이 낮으면 방향 전환이 느려집니다.
C. Acceleration
설명: 에이전트가 정지 상태에서 목표 속도에 도달하는 데 걸리는 시간을 결정하는 값입니다. 높은 값일수록 더 빠르게 가속합니다.
용도: 캐릭터가 목표 지점까지 빠르게 달려가거나 천천히 가속하도록 설정할 수 있습니다.
예시:
Acceleration = 8: 에이전트는 초당 8m/s²로 가속할 수 있습니다. 이 값이 높으면 더 빠르게 가속합니다.
D. Stopping Distance
설명: 에이전트가 목표 지점에 도착하기 전에 멈추는 거리를 설정합니다. 이 값에 따라 에이전트는 목표 지점에 도달하기 전에 멈추거나 목표 지점에 정확히 도착합니다.
용도: 에이전트가 목표 지점까지 얼마나 가까이 다가갈지 설정합니다. 에이전트가 플레이어와의 거리를 유지하거나 목표를 향해 계속 달려가게 할 때 유용합니다.
예시:
Stopping Distance = 2: 에이전트는 목표 지점에서 2미터 떨어져 멈춥니다. 값이 낮으면 목표에 더 가깝게 멈춥니다.
E. Auto-Braking
설명: 이 옵션은 에이전트가 목표 지점에 가까워지면 자동으로 속도를 줄이는지 여부를 설정합니다.
용도: 에이전트가 목표 지점에서 부드럽게 멈추게 할지 또는 갑작스럽게 멈추게 할지 결정할 수 있습니다. 에이전트가 멈출 때 브레이크를 적용할지를 제어하는 역할을 합니다.
예시:
Auto-Braking 활성화: 에이전트는 목표 지점에 가까워질수록 속도를 줄입니다.
Auto-Braking 비활성화: 에이전트는 마지막 순간까지 속도를 유지하고 갑자기 멈춥니다.
F. Radius
설명: 에이전트의 반경을 설정합니다. 에이전트가 NavMesh에서 이동할 수 있는 폭을 결정합니다. 이 값이 커지면 좁은 통로를 통과할 수 없고, 작은 값이면 좁은 길도 통과할 수 있습니다.
용도: 에이전트의 충돌 영역을 정의하여 좁은 공간을 통과할 수 있도록 설정합니다.
예시:
Radius = 0.5: 에이전트는 0.5미터 반경을 차지하며, 좁은 통로를 지날 수 있습니다.
G. Height
설명: 에이전트의 높이를 설정합니다. 이 값은 에이전트가 통과할 수 있는 최소 높이를 정의합니다.
용도: 에이전트가 지나갈 수 있는 문, 터널 등의 높이를 설정할 수 있습니다. 높이가 설정된 값보다 낮은 공간은 통과할 수 없습니다.
예시:
Height = 2: 에이전트는 2미터 이상의 높이를 가진 공간만 통과할 수 있습니다.
요약:
Agent Type: 에이전트의 유형을 설정하여 크기와 이동 규칙을 정의합니다.
Base Offset: NavMesh와 에이전트 간의 수직 오프셋을 설정하여 이동할 때 에이전트의 기준 높이를 조정합니다.
Steering: 에이전트가 경로를 따라 이동할 때의 속도, 회전 속도, 가속도, 멈춤 거리를 설정하는 옵션입니다.
Speed: 에이전트의 최대 이동 속도.
Angular Speed: 에이전트의 회전 속도.
Acceleration: 가속 속도.
Stopping Distance: 목표 지점에서 멈추는 거리.
Auto-Braking: 목표 지점에 가까워지면 자동으로 속도를 줄일지 여부.
Radius: 에이전트의 충돌 반경.
Height: 에이전트의 높이. 에이전트가 지나갈 수 있는 최소 높이를 결정합니다.
▣ 코드설명
Start() 메서드:
좀비의 NavMeshAgent와 Animator를 초기화하고, PlayerManager에서 플레이어의 Transform을 가져옵니다.
좀비의 타입에 따라 속도와 공격 딜레이를 설정합니다.
초기 상태는 순찰(Patrol) 상태로 설정하고, Patrol()을 호출하여 순찰을 시작합니다.
Update() 메서드:
플레이어와의 거리를 계산하여 좀비가 추적 또는 공격을 시작할지 결정합니다.
플레이어가 감지 범위에 들어오면 추적 상태로 전환하고, 공격 범위에 들어오면 공격 상태로 전환합니다.
현재 상태에 따라 순찰, 추적, 공격 등의 동작을 수행합니다.
Patrol(), ChasePlayer() 및 AttackPlayer():
Patrol(): 좀비가 순찰 지점으로 이동합니다. 순찰 지점에 도착하면 Idle 상태로 전환됩니다.
ChasePlayer(): 플레이어를 추적하는 동작을 수행합니다.
AttackPlayer(): 플레이어가 공격 범위에 있을 때 공격 애니메이션을 실행하고 공격 수행 로직을 처리합니다.
PerformAttack():
좀비의 손 위치에서 SphereCast를 사용해 플레이어와 충돌을 감지하고, 플레이어가 충돌하면 데미지를 입히는 로직을 처리합니다.
EndAttack() 및 AttackCooldown():
EndAttack(): 공격이 끝난 후 다시 추적 또는 순찰 상태로 돌아갑니다.
AttackCooldown(): 공격이 끝난 후 일정 시간 동안 공격 대기를 하고, 다시 공격할 수 있도록 상태를 변경합니다.
▣ 좀비 오브젝트에 Capsule Collider를 추가하여 물리적 충돌을 감지합니다.
Capsule Collider는 좀비의 크기에 맞게 설정합니다.
Rigidbody를 추가하여 충돌을 처리하되, isKinematic 옵션을 체크하여 물리적 힘에 영향을 받지 않도록 설정합니다.
▣ 플레이어에 Collider가 없을 때: 플레이어에 Collider가 없고, CharacterController만 있을 경우 SphereCast가 충돌하지 않을 수 있습니다. CharacterController는 물리 엔진에서 충돌체로 작용하지 않을 수 있기 때문입니다.
https://docs.unity3d.com/kr/2022.3/Manual/nav-BuildingNavMesh.html
'[ Unity ] > - 유니티 실습' 카테고리의 다른 글
유니티 Weapon Fire Delay (0) | 2024.10.19 |
---|---|
유니티 FlashLight (1) | 2024.10.18 |
유니티 3D UI (0) | 2024.10.17 |
유니티 WeaponManager (0) | 2024.10.16 |
유니티 ObstacleManager(장애물관리) (1) | 2024.10.15 |
댓글