Unity 최종 프로젝트 - 7

이준호·2024년 1월 22일
0

📌 Unity 최종 프로젝트



📌 추가 사항

➔ Enemy AI

  • Region Setting

    • 작성할 Action 노드들을 각 분기에 맞게 region으로 묶어서 정리하였습니다
  • Layer 6번에 Player 추가.

  • BTTest Scene에 Test용으로Navigation(Obstacle), Bake로 구워둠.

  • In Range Player Check

    • OverlapSphere를 이용해 Layer가 Player인 경우 _detctedPlayer변수에 Player의 transform을 할당.
    • 범위 밖으로 나가면 transform을 비운다.
  • correct Position Check & Random Position

    • Random.Range를 이용하여 맵의 최대 크기 안에서 x,z 좌표(Vector3)에 랜덤 값 부여
    • agent.pathStatus를 이용해 경로가 유요한지 체크
  • InitializeAgent
    - agent의 정지 거리, 이동 속도, 목적지, 회전 유무, 가속도를 할당












📌 Unuty Navigation

  • Mesh : 3D에서 삼각형이나 다각형 여러개로 면을 구성하는 것을 의미
  • NavMesh : 다각형 여러개로 캐릭터가 이동할 수 있는 표면을 구성하는 것
  • Agent : Navigation Mesh 위에서 움직이는 대상

➔ Why Unity AI Navigation?

  • Enemy AI를 구성하던 도중 시간에 맞추기 위해 유니티에서 지원해주는 AI 시스템 Navigation을 사용하게 되었다.
    안에 내장 기능들이 많아 내가 원하는 목적지까지의 올바른 경로를 판단하고 장애물을 피해 이동하는 움직임을 구현하기 위해서 내용을 공부하고 정리해두려고 한다.


➔ NavMesh - Navigation (Obsolete)

Unity에서 지원하는 AI Navigation에서는 크게 3종류로 나눠진다. NavMesh, NavMeshAgent, NavMeshObstacle

Object

Scene Filter

  • All : Scene에 있는 모든 Object를 보여준다.

  • Mesh Renderes : MeshRenderer 컴포넌트를 가지고있는 Object만 보여주는 필터

  • Terrains : Unity Engine에서 거대한 평면에 직접 높낮이를 조절하면서 지형을 만들수 있는 터레인 오브젝트만을 보여주는 필터

Bake

  • Agent Radius : NavMesh위에서 움직일 대상의 반지름

  • Agent Height : Agent의 키

  • Max Slope : NavMesh위에서 이동할 수 있는 길의 경사로의 최대각도

  • Step Height : Agent가 가벼운 계단정도로 여기고 올라갈수 있는 단의 높이

Areas

  • 사용자가 필요한 Navigation Mesh 구역을 설정하고, 그 지나가는 구역의 비용(Cost)을 설정할 수 있는 탭

Agents

  • Agent types에 다른 타입을 추가하여 다양한 타입의 Agent를 구성 가능
    (위 Humanoid와 Big Enemy 등 두께 높이 등등을 다르게 조절가능)



➔ NavMeshAgent

  • Base Offset : 길을 찾을 떄 사용되는 충돌 실린더의 위치이다. 이 값을 조절해보면 캡슐 게임 오브젝트가 바닥에 파묻히거나 공중에 뜨는 것을 볼 수 있다.

Steering

  • Speed : Agent가 움직이는 속도

  • Angular Speed: Agnet가 회전하는 속도 (degree/sec)

  • Acceleration : Agnet의 가속도

  • Stopping Distance : 목표와 얼마만큼의 거리를 두고 멈출지에 대한 길이

  • Auto Breaking : Agnet가 목적지에 도착하기 직전에 감속을 할 것인가 유무

Obstacle Avoidance

NavMeshObstacle을 어떻게 회피할 것인지를 결정하는 프로퍼티들을 가지고 있다.
기본 상황에서 이동하는 Agnet는 길을 막고있는 Agnet를 향해서 이동하다가 돌아갈 길이 있으면 돌아가고 길이 없다면 살짝 밀어내고 길을 찾아간다.

  • Radius : Agnet가 다른 오브젝트와 겹쳐지지 않게 밀어내는 정도의 반지름 (반지름 충돌)

  • Height : Agnet끼리의 높이 충돌을 조절하는 프로터피

  • Quality : 높은(High) Quality일수록 다른 Agnet를 회피하기 위해 정밀한 움직임을 보이고 낮은(Low) Quality일수록 피하는 움직임이 간소화된다.
    (양 쪽 모두 None일 경우, 서로 완전히 무시한다.)

  • Priority : Agnet간의 우선순위. 숫자가 낮을수록 높다.
    우선순위가 높은 Agnet는 길을 찾을 때 우선순위가 낮은 Agnet를 고려하지 않고 그냥 밀고 지나간다.
    우선순위가 같다면 회피하려는 노력을 하고 여의치 않다면 그냥 밀고 지나간다.
    우선순위가 낮은 Agnet는 높은 우선순위의 Agnet를 밀어내지 못한다.

PathFinding

  • Auto Repath : Navigation Mesh에 변동이 생겼을 때, 자동으로 길을 다시 찾을 것인가 설정하는 프로퍼티이다.
    목적지로 가는 최단 경로의 중간이 막히면 자동으로 경로를 다시 계산해서 이동한다.
    (하지만 아주 먼 거리를 이동할 때 아직 시야에 보이지 않는 중간이 막혀도 경로를 재계산하기 때문에 경로가 막힌 구역까지 도착한 다음 새로 계산가히를 원하면 체크를 해제하고, 경로가 막힌 구역까지 도착한 다음 경로를 새로 계산하는 기능을 직접 구현해야 한다.)

  • Area Mask : Agnet가 지나갈 수 있는 영역과 지나가지 못하는 영역을 설정할 수 있다.
    특정 영역을 꺼준다면 해당 캐릭터는 아무리 가까운 거리라도 그 영역을 통해 건너지 못한다.




➔ NavmeshObstacle

이 컴포넌트는 장애물 역할을 한다. 기본 상태에서는 작은 장애물에만 자연스러운 움직임을 보이고 큰 장애물은 부자연스럽게 회피하는 동작을 보인다.

작은 장애물만 회피가 가능하면 Navigation Static으로 설정한 벽을 배치하는게 더 나을 것이라고 생각할 수 있지만, Navigation Static으로 설정된 벽은 움직일 수 없다. 반대로 NavMeshObstacle을 사용하는 장애물은 런타임중에도 언제든지 움직일 수 있다.

또한 실시간으로 에이전트를 밀어내는 동작도 가능하며, 장애물에 밀려난 목적지가 있는 에이전트는 다시 원래 자리로 돌아오려는 움직임을 보이게 된다.

  • Shape : 장애물의 형태를 결정하는 옵션으로 Box, Capsule 두 가지 형태를 지원한다. Carve를 제외한 프로퍼티는 이 Box나 Capsule의 크기를 설정하는데 쓰인다.

  • Carve : Carve는 ‘파내다’ 라는 뜻으로 Navigation Mesh 영역을 새로 굽지 않아도 “실시간”으로 ‘파내서’ 에이전트가 지나갈 수 없는 영역으로 만드는 것이다.
    Carve를 켜서 실시간으로 Navigation Mesh를 파내게 하면 큰 장애물도 자연스럽게 회피가 가능하다.

Carve 하위 프로퍼티

  • Move Threshold : Crave의 하위 프로터피로 최소 이동 거리를 뜻한다. Move Threshold보다 조금 움직인 것은 오브젝트가 움직이지 않은 것으로 간주하여 Carve를 새로 계산하지 않는다.

  • Time to Stationary : 게임 오브젝트가 얼만큼 정지해있다면 완전히 멈춘 것으로 판단하고 Carve를 새로 계산해서 Navigation Mesh를 파낼지 결정하는 값이다.

  • Carve Only Stationary : 정지된 상태에서만 Navigation Mesh를 파낼지 결정하는 프로퍼티이다.
    true라면 장애물이 움직이면 파내진 구멍이 사라졌다가 정지하면 Navigation Mesh를 다시 파낸다.
    false라면 Navigation Mesh가 실시간으로 파진다.

➔ Destination / SetDestination & SetPath

  • 다음 시간에 더 조사하고 정리...

참고 자료

베르의 게임개발 유튜브
Unity Documentation



profile
No Easy Day

0개의 댓글