본문 바로가기
[ Unity ]/- 유니티 실습

유니티 ai NavMeshAgent

by MRG 2024. 1. 20.
728x90
반응형

 

▣ 먼저 Packages에서 AI Navigation를 추가합니다. 

 

 

▣ Zombie 오브젝트에 Nav Mesh Agent Component 추가합니다. 

 

▣ Nav Mesh Agent 컴포넌트는 Unity에서 AI 캐릭터의 경로 탐색을 담당하는 주요 컴포넌트입니다. 

이 컴포넌트는 NavMesh(내비게이션 메시)를 기반으로 캐릭터가 장애물을 피하면서 목적지까지 이동할 수 있게 

도와줍니다. 주로 적 AI, NPC, 유닛 등의 경로 탐색을 구현할 때 사용됩니다.

▣ Nav Mesh Agent 개념 설명
Nav Mesh Agent는 미리 설정된 NavMesh 상에서 이동하며, 다음과 같은 기능을 제공합니다:

목적지 설정: NavMesh 상의 목표 지점까지 이동합니다.
장애물 피하기: 경로 상에 있는 장애물을 자동으로 피하면서 이동합니다.
경로 재탐색: 동적인 환경에서 실시간으로 경로를 재계산하여 목적지까지 도달합니다.
속도, 회전, 가속도 등 다양한 움직임 설정을 지원합니다.
이를 사용하기 위해서는 먼저 NavMesh를 생성하고, Nav Mesh Agent 컴포넌트를 캐릭터에 추가해야 합니다.

 

 

▣ Agent Type 메뉴
Agent Type 메뉴는 NavMesh에서 에이전트가 탐색할 수 있는 경로의 유형을 결정하는 설정입니다. Unity에서는 다양한 Agent Type을 설정할 수 있으며, 이는 서로 다른 크기나 성질을 가진 에이전트가 같은 장면에서 다르게 탐색하도록 할 때 유용합니다.

Agent Type의 주요 기능
크기 설정: 각 에이전트는 고유한 Radius(반지름)와 Height(높이) 값을 가질 수 있으며, 이를 통해 에이전트가 탐색할 수 있는 좁은 공간이나 높은 장애물에 대한 처리 방식이 결정됩니다.
NavMesh 분리: 서로 다른 Agent Type을 사용하면 서로 다른 NavMesh가 생성되므로, 특정 캐릭터는 한 NavMesh에서만 탐색하게 설정할 수 있습니다.
Agent Type 설정 방법
Unity 상단 메뉴에서 Window → AI → Navigation 창을 엽니다.
Agent Type에서 기본으로 제공하는 타입 외에도 새로운 타입을 추가할 수 있습니다.
각 Agent Type마다 Radius와 Height 값을 설정하여 각 에이전트가 탐색할 수 있는 경로를 정의할 수 있습니다.

 

 


▣  Steering 메뉴
Steering 메뉴는 에이전트의 이동 방향과 속도, 회전 속도 등을 제어하는 항목입니다. 이 메뉴의 항목들은 에이전트가 얼마나 자연스럽게 목표 지점으로 이동할지, 그리고 어떻게 회전하고 멈출지를 결정합니다.

Steering 메뉴 항목 설명
Speed:
에이전트가 이동하는 속도를 설정합니다.
값이 높을수록 에이전트는 빠르게 움직이고, 낮을수록 천천히 이동합니다.
기본값: 3.5


Angular Speed:
에이전트가 회전할 수 있는 회전 속도를 결정합니다.
단위는 초당 회전할 수 있는 각도(도)이며, 값이 높을수록 빠르게 방향을 전환합니다.
기본값: 120


Acceleration:
에이전트가 목표 속도에 도달하는 가속도를 설정합니다.
값이 높을수록 에이전트가 빠르게 가속하고, 낮을수록 천천히 가속합니다.
기본값: 8


Stopping Distance:
에이전트가 목표 지점에 가까워졌을 때 멈추는 거리를 설정합니다.
예를 들어, 0으로 설정하면 목표 지점에 완전히 도달할 때까지 이동하고, 값이 크면 목표 지점에서 일정 거리만큼 떨어진 상태에서 멈춥니다.
기본값: 0


Auto Braking:
에이전트가 목표 지점에 가까워질 때 자동으로 감속하는지 여부를 설정합니다.
체크되어 있으면 목표 지점에 다가갈수록 에이전트가 속도를 줄여 자연스럽게 멈춥니다.
체크 해제하면 속도를 유지하며 목표 지점에 도착합니다.


NavMeshAgent.updatePosition:
에이전트의 위치를 자동으로 업데이트할지 여부를 결정합니다.
체크하면 에이전트는 NavMesh에서의 위치를 기준으로 계속해서 움직입니다.


NavMeshAgent.updateRotation:
에이전트가 자동으로 회전할지 여부를 설정합니다.
체크하면 에이전트는 목표 방향을 향해 자동으로 회전합니다.

 


▣  Obstacle Avoidance 메뉴
Obstacle Avoidance 메뉴는 에이전트가 장애물을 어떻게 피할지에 대한 설정을 제어하는 항목입니다. 에이전트는 경로 상에 있는 고정된 또는 동적인 장애물을 감지하고, 이를 회피하는 방식으로 경로를 재설정할 수 있습니다.

Obstacle Avoidance 메뉴 항목 설명
Quality (Quality vs. Performance):
장애물을 피하는 알고리즘의 품질을 결정합니다. 품질이 높을수록 에이전트는 더 정확하게 장애물을 피하지만, 성능에 영향을 미칠 수 있습니다.
None: 장애물 회피를 사용하지 않음.
Low Quality Obstacles Avoidance: 간단한 회피 방법을 사용하여 성능을 우선시합니다.
High Quality Obstacles Avoidance: 고품질 회피 방법을 사용하여 자연스러운 장애물 피하기 동작을 수행하지만, 성능 저하가 있을 수 있습니다.


Priority:
다른 에이전트와의 충돌을 피하기 위한 우선 순위를 설정합니다.
값이 낮을수록 더 높은 우선 순위를 가지며, 다른 에이전트는 해당 에이전트를 피해 경로를 변경합니다. 값이 높을수록 해당 에이전트는 다른 에이전트에게 길을 양보합니다.
기본값: 50 (1~99 사이 값 설정 가능)


Avoidance Radius:
에이전트가 회피해야 하는 최소 거리입니다. 이 값이 클수록 에이전트는 장애물과 멀리 떨어져 회피하려고 합니다.
이 값은 에이전트의 회전 반경 및 경로 재설정에 영향을 줍니다.

 


▣  Obstacle Avoidance vs. NavMesh Obstacle
Nav Mesh Obstacle 컴포넌트와 Obstacle Avoidance 설정은 다릅니다. Nav Mesh Obstacle은 고정된 장애물을 나타내며, 에이전트는 이 컴포넌트를 가진 오브젝트 주위를 돌아가거나 피합니다. 

반면, Obstacle Avoidance는 동적 장애물과 다른 에이전트 간의 충돌을 피하는 데 사용됩니다.

 

 

https://docs.unity3d.com/kr/2021.3/Manual/class-NavMeshAgent.html

 

내비메시 에이전트 - Unity 매뉴얼

NavMeshAgent 컴포넌트는 목표를 향해 움직일 때 서로를 피해가는 캐릭터 생성에 유용합니다. 에이전트는 내비메시를 이용하여 게임 월드에 대해 추론하고 서로 또는 기타 움직이는 장애물을 피할

docs.unity3d.com

 

 

▣ Zombie 스크립트를 생성해서 추가하고 스크립트에 AI에 대한 네임스페이스를 UnityEngine.AI 추가합니다. 

 

▣ AI에 모든 상태, 상황에 대한 변수를 정의해야 합니다. 위에 주석처럼 필요한 변수들을 선언합니다.

 

 

 

▣ Start() 함수에서 애니메이션, AI, 플레이어에 대한 정보를 대입합니다.

 

▣ Update() 함수에서는 시야 범위를 CheckSphere() 함수를 통해 체크하고 범위 들어오면 조건에 따라 상태를 호출합니다.

 

▣ CheckSphere() : 세계 좌표 position에 의해 정의된 구와 겹치는 충돌체가 있는 경우 true를 반환합니다

 

https://docs.unity3d.com/ScriptReference/Physics.CheckSphere.html

 

Unity - Scripting API: Physics.CheckSphere

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

 

 

▣ OnDrawGizmosSelected() 함수를 사용하여 기지모에 색을 넣어서 공격범위, 시야범위를 그려주는 코드를 완성합니다. 

 

https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnDrawGizmosSelected.html

 

Unity - Scripting API: MonoBehaviour.OnDrawGizmosSelected()

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

 

 

▣ Patroling() 함수 순찰 중 함수를 완성합니다. 

이동포인트가 도착했을 때 여부에 따라 이동하고 새로운 경로를 지정하고에 대한 코드를 완성했습니다.

 

▣ agent.speed는 ai에 이동 속도를 나타냅니다. 

 

▣ SetDestination() 함수는

목적지를 설정하거나 업데이트하여 새 경로에 대한 계산을 트리거합니다.

몇 프레임이 지나야 경로를 사용할 수 있습니다. 경로가 계산되는 동안 pathPending은 true입니다. 유효한 경로를 사용할 수 있게 되면 에이전트는 이동을 재개합니다.

 

https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent.SetDestination.html

 

Unity - Scripting API: AI.NavMeshAgent.SetDestination

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

▣ Vector3.magnitude 는 벡터의 길이를 반환합니다

현재 좀비에 위치와 이동포인트 위치를 빼서 그에 대한 길이를 구해 isWalkPoint 여부를 지정합니다. 

 

https://docs.unity3d.com/ScriptReference/Vector3-magnitude.html

 

Unity - Scripting API: Vector3.magnitude

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

 

▣ 플레이어를 발견하면 쫓아가는 함수와 공격하는 함수입니다. 

 

▣ Invoke() 함수는  시간(초) 단위로 메서드를 호출합니다 

이 함수를 통해서 공격시간을 지정합니다.

 

 

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

 

Unity - Scripting API: MonoBehaviour.Invoke

If time is set to 0 and Invoke is called before the first frame update, the method is invoked at the next Update cycle before MonoBehaviour.Update. In this case, it's better to call the function directly. Note: Setting time to negative values is identical

docs.unity3d.com

 

 

▣ Windows -> AI -> Navigation (Obsolete)를 추가하고 해당 Zombie오브젝트에서 Navigation 메뉴에 Bake로 AI 이동할 경로를 지정합니다. 

 

▣ Unity의 Bake 메뉴는 NavMesh를 생성(베이킹)하는 설정을 제공하는 메뉴로, AI 에이전트가 경로 탐색을 할 수 있도록 씬 내의 NavMesh를 미리 계산하여 준비하는 과정입니다. Bake 메뉴는 Navigation 창 안에 있으며, NavMesh 생성을 위한 다양한 옵션을 제공합니다. 이 메뉴를 통해 Unity 씬에서 AI 캐릭터가 이동할 수 있는 영역을 설정하고, 장애물, 바닥 높이 등을 고려하여 탐색할 수 있는 맵을 생성할 수 있습니다.

 

▣ Bake 메뉴 주요 항목
1) Agent Radius
NavMesh 에이전트의 반지름을 정의합니다. 이 값은 에이전트가 이동할 수 있는 최소 경로의 너비를 결정합니다.
이 값이 크면 좁은 통로나 가까운 두 물체 사이를 지나기 어렵게 됩니다. 작은 값일수록 더 좁은 공간을 통과할 수 있습니다.
2) Agent Height
NavMesh 에이전트의 높이를 설정합니다. 이 값은 에이전트가 통과할 수 있는 최소 높이를 결정합니다.
에이전트의 높이가 장애물에 맞지 않도록 하려면, 이 값을 정확하게 설정하는 것이 중요합니다.
3) Max Slope
에이전트가 오를 수 있는 최대 경사각을 정의합니다. 이 값이 클수록 가파른 경사를 올라갈 수 있습니다.
기본적으로 평면에서 에이전트는 자유롭게 이동할 수 있지만, 이 값이 높으면 경사지를 에이전트가 탐색 가능하게 만듭니다.
예: 45도로 설정하면 45도 이하의 경사를 올라갈 수 있습니다.
4) Step Height
에이전트가 넘을 수 있는 최대 계단 높이를 정의합니다.
이 값이 높으면 에이전트는 낮은 장애물이나 계단을 넘어갈 수 있지만, 너무 높으면 현실적인 움직임을 벗어날 수 있습니다.
5) Drop Height
에이전트가 떨어질 수 있는 최대 높이를 정의합니다.
이 값은 NavMesh가 경로를 생성할 때, 에이전트가 무시할 수 있는 높이 차이를 나타냅니다. 설정된 값보다 큰 높이 차이가 있을 경우 NavMesh는 경로를 생성하지 않습니다.
6) Jump Distance
에이전트가 점프할 수 있는 최대 거리를 정의합니다.
이 값이 클수록 에이전트가 장애물을 넘어가거나 높은 곳으로 뛰어 넘는 것과 같은 경로를 계산할 수 있습니다.


3. Advanced 옵션
Advanced 섹션에는 더욱 세밀한 설정 옵션들이 있습니다.
1) Manual Voxel Size
NavMesh가 생성될 때 사용하는 voxel(복셀) 크기를 수동으로 설정할 수 있습니다.
복셀은 NavMesh를 구성하는 작은 셀이며, 이 값이 작을수록 더 정밀한 NavMesh를 생성할 수 있습니다. 다만 값이 작을수록 성능에 부담을 줄 수 있습니다.
이 옵션을 체크하면 아래에 Voxel Size 값을 수동으로 조정할 수 있는 입력란이 나타납니다.
2) Min Region Area
NavMesh에서 탐색 가능한 최소 영역 크기**를 정의합니다.
작은 값일수록 더 작은 영역도 탐색 가능한 경로로 생성되지만, 성능에 영향을 줄 수 있습니다. 너무 작으면 작은 구석에 에이전트가 갇힐 수 있으므로 적절한 값을 설정하는 것이 좋습니다.
3) Height Mesh
체크하면 높이 메시 정보를 포함한 NavMesh를 생성합니다.
Height Mesh는 더 정밀한 경로 탐색을 가능하게 하며, 특히 여러 높이가 존재하는 복잡한 환경에서 에이전트의 움직임을 자연스럽게 만들 수 있습니다.
4. Bake 버튼
모든 설정을 완료한 후 Bake 버튼을 클릭하면, 현재 씬에서 설정된 NavMesh가 생성됩니다.
이 과정에서 Unity는 씬의 모든 오브젝트와 지형을 분석하여 NavMesh를 자동으로 계산하고 베이킹합니다.

 

https://docs.unity3d.com/kr/2022.3/Manual/nav-BuildingNavMesh.html

 

내비메시 빌드 - Unity 매뉴얼

레벨 지오메트리에서 내비메시 생성 프로세스를 내비메시 베이킹이라 부릅니다.이 프로세스는 내비게이션 정적으로 마크된 렌더 메시와 모든 게임 오브젝트의 터레인을 수집한 후 처리하여 레

docs.unity3d.com

 

 

▣ 저장 후 플레이를 하고 스크립트 범위 및 포인트 위치를 이동하고 재생하면 AI가 코드에 맞게 작동합니다. 

728x90
반응형

'[ Unity ] > - 유니티 실습' 카테고리의 다른 글

유니티 애니메이션 스프라이트  (0) 2024.07.10
유니티 night skybox  (0) 2024.01.21
유니티 배경음악, 레벨유지  (2) 2024.01.19
유니티 raycast, 총알효과  (1) 2024.01.19
유니티 3d ui  (0) 2024.01.18

댓글