내일배움캠프 Unity 36일차 TIL - 팀 팀노션원본 - 개발일지

Wooooo·2023년 12월 18일
0

내일배움캠프Unity

목록 보기
38/94

오늘의 키워드

저번 주 금요일에 작업한 FSM이 상속 구조에서 사용하기에 문제가 있어서 어떻게 사용해야할 지 고민해봤다.
Navmesh plus를 이용하여 2D Pathfinding을 구현하였다.


트러블 슈팅

내가 만들어둔 FSM은 제네릭을 이용하여 상태를 정의한 enum을 넘겨받아 선언하는 구조로 짜여있다.

문제는 부모클래스에 이미 FSM이 선언돼 있고, 자식 클래스에서 또 다른 enum을 선언해 FSM을 사용할 경우, 메모리에는 여러 개의 FSM이 남게 됐다.

또, 부모 객체의 FSM과 자식 객체의 FSM이 서로 다른 상태 열거형을 가지고 있어서, 두 FSM을 하나로 합치기도 번거로웠다.

해결법은 두 가지가 떠올랐다.

  • StateMachine 클래스 구조를 변경하여 상속 구조에서도 제대로 동작하도록 변경
    event Dictionary에 enum타입을 key로 넣지말고, string으로 넣어주면 상속 구조에서도 동작이 가능할 것 같음.
  • Creature, Monster와 같은 추상적인 클래스에는 FSM을 적용하지 말고, 실제로 움직임, 패턴을 구현하는 최하단 클래스에 FSM 적용

나는 후자의 방법으로 작업을 진행하기로 했다.


Navmesh plus를 이용한 2D Pathfinding

Github : Navmesh plus
Youtube : Navmesh plus tutorial

유니티는 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에서 확인할 수 있다.


profile
game developer

0개의 댓글