저번 주 금요일에 작업한 FSM
이 상속 구조에서 사용하기에 문제가 있어서 어떻게 사용해야할 지 고민해봤다.
Navmesh plus를 이용하여 2D Pathfinding을 구현하였다.
내가 만들어둔 FSM
은 제네릭을 이용하여 상태를 정의한 enum을 넘겨받아 선언하는 구조로 짜여있다.
문제는 부모클래스에 이미 FSM
이 선언돼 있고, 자식 클래스에서 또 다른 enum을 선언해 FSM
을 사용할 경우, 메모리에는 여러 개의 FSM
이 남게 됐다.
또, 부모 객체의 FSM
과 자식 객체의 FSM
이 서로 다른 상태 열거형을 가지고 있어서, 두 FSM
을 하나로 합치기도 번거로웠다.
해결법은 두 가지가 떠올랐다.
나는 후자의 방법으로 작업을 진행하기로 했다.
유니티는 3D에선 기본적으로 네비게이션/패스파인딩을 지원하지만, 2D에선 외부에셋을 사용해야한다.
Navmesh 위를 돌아다닐 agent이다.
Speed : 이동속도
Angular Speed : 회전속도
Acceleration : 가속도
Stopping Distance : 정지 거리
등등 .. 여러가지 설정을 해줄 수 있다.
코드에서, SetDestination()
메서드로 길을 찾아가게 할 수 있다.
이외에도 남은 거리, 정지해 있는지 여부 등등 다양한 정보들도 지원해준다.
Unity 내부 패키지인 Unity AI Navigation 패키지를 설치해야 사용할 수 있다!
맵 상의 걸어다닐 수 있는 곳, 걸어다닐 수 없는 곳 등을 설정하기 위한 컴포넌트다.
흰 사각형은 Walkable, 빨간 사각형은 Not Walkable로 설정했다. 파란 원은 몬스터다.
이렇게 설정한 modifier들은 이후 Navmesh를 bake하면, 노드들이 생성되고 agent가 pathfinding을 할 수 있게 된다.
위에서 설정한 modifer들을 bake해 Navmesh를 생성한다.
Navmesh plus에서 지원하는 컴포넌트. 이 컴포넌트를 이용해 2D에서의 Navmesh를 bake하게 도와준다.
Rotate Surface to XY 버튼을 누르면, 오브젝트가 90도 회전하여 2D 평면상으로 눕는다.
Bake 이후의 모습. Navmesh가 생성되어, Sceneview에서 확인할 수 있다.