▣ 먼저 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
▣ Zombie 스크립트를 생성해서 추가하고 스크립트에 AI에 대한 네임스페이스를 UnityEngine.AI 추가합니다.
▣ AI에 모든 상태, 상황에 대한 변수를 정의해야 합니다. 위에 주석처럼 필요한 변수들을 선언합니다.
▣ Start() 함수에서 애니메이션, AI, 플레이어에 대한 정보를 대입합니다.
▣ Update() 함수에서는 시야 범위를 CheckSphere() 함수를 통해 체크하고 범위 들어오면 조건에 따라 상태를 호출합니다.
▣ CheckSphere() : 세계 좌표 position에 의해 정의된 구와 겹치는 충돌체가 있는 경우 true를 반환합니다
https://docs.unity3d.com/ScriptReference/Physics.CheckSphere.html
▣ OnDrawGizmosSelected() 함수를 사용하여 기지모에 색을 넣어서 공격범위, 시야범위를 그려주는 코드를 완성합니다.
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnDrawGizmosSelected.html
▣ Patroling() 함수 순찰 중 함수를 완성합니다.
이동포인트가 도착했을 때 여부에 따라 이동하고 새로운 경로를 지정하고에 대한 코드를 완성했습니다.
▣ agent.speed는 ai에 이동 속도를 나타냅니다.
▣ SetDestination() 함수는
목적지를 설정하거나 업데이트하여 새 경로에 대한 계산을 트리거합니다.
몇 프레임이 지나야 경로를 사용할 수 있습니다. 경로가 계산되는 동안 pathPending은 true입니다. 유효한 경로를 사용할 수 있게 되면 에이전트는 이동을 재개합니다.
https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent.SetDestination.html
▣ Vector3.magnitude 는 벡터의 길이를 반환합니다
현재 좀비에 위치와 이동포인트 위치를 빼서 그에 대한 길이를 구해 isWalkPoint 여부를 지정합니다.
https://docs.unity3d.com/ScriptReference/Vector3-magnitude.html
▣ 플레이어를 발견하면 쫓아가는 함수와 공격하는 함수입니다.
▣ Invoke() 함수는 시간(초) 단위로 메서드를 호출합니다
이 함수를 통해서 공격시간을 지정합니다.
https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html
▣ 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
▣ 저장 후 플레이를 하고 스크립트 범위 및 포인트 위치를 이동하고 재생하면 AI가 코드에 맞게 작동합니다.
'[ 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 |
댓글