[HappyTools] StateMachineBase

2023. 3. 13. 02:30코드 전시관/Unity

HappyTools 프로젝트

더보기

HappyTools는 Unity로 게임을 만들면서 자주 사용하게 되는 기능, 클래스 등을 모아두는 Utility 라이브러리입니다.

딱히 구조가 탄탄한 라이브러리는 아니고, 그냥 제가 개발하면서 썼던 기능들을 아카이브 해두는 용도입니다.

나중에 게임 프로토타이핑이나 게임 개발에 사용할 수 있도록 하는게 목표입니다.

 

HappyTools Github : https://github.com/HappyFaceFriend/HappyTools

 

GitHub - HappyFaceFriend/HappyTools: My own code base which consists of utilities and useful base classes.

My own code base which consists of utilities and useful base classes. - GitHub - HappyFaceFriend/HappyTools: My own code base which consists of utilities and useful base classes.

github.com

 

 

게임 개발을 하다보면 FSM(Finite State Machine) 패턴을 많이 사용하게 됩니다.

Enum 기반의 State Machine은 코드가 한 페이지에 몰린다는 단점이 있어서, 

인스펙터에서 각각 State의 parameter들을 조정할 수 있는 State Machine / State 클래스를 만들기로 했습니다.

 

[Github]

 - Demo : https://github.com/HappyFaceFriend/HappyTools/tree/main/Assets/Demos/StateMachineDemo

 - Script : https://github.com/HappyFaceFriend/HappyTools/tree/main/Assets/Scripts/StateMachine

간단한 구현 설명

StateBase

MonoBehaviour를 상속받으며 이 State를 실행할 StateMachineBase의 레퍼런스를 갖고 있습니다.

StateBase를 상속받는 클래스는 StateMachineBase가 호출할 수 있는 OnEnter / OnUpdate / OnExit 함수를 구현하도록 합니다.

추가적으로 StateAnimatorParamData를 이용해 이 State에 Enter/Exit 할 때 애니메이터에 보낼 파라미터들을 인스펙터에서 정할 수 있습니다.

StateMachineBase

MonoBehaviour를 상속받으며 currentState에 해당하는 StateBase 객체의 Enter/Update/Exit 함수를 호출합니다.

State를 변경하는 ChangeState 함수와 CurrentState, PreviousState를 확인할 수 있는 속성을 제공합니다.

InitialState를 인스펙터에서 설정해줘야합니다.

추가적으로 각각의 State에서 GetComponent를 하면 같은 Component를 여러번 찾게 되므로, StateMachineBase에서 Component들을 Dictionary에 캐싱해 State에서 GetComponent를 하면 캐싱 한 레퍼런스를 반환해줍니다.

 

Demo 설명

 

 

Demo는 코드가 길지 않기때문에 코드를 보면 사용방법을 금방 알 수 있습니다.

 

PlayerBehaviour은 StateMachineBase를 상속받으며, 공격력 정보를 포함하는 것 외에는 별 다른 일을 하지 않습니다.

 

아래는 State 중 하나인 WalkState의 예시입니다. PlayerState는 StateBase를 상속받고, PlayerBehaviour에 접근할 수 있도록 Player 속성 하나만 추가했습니다.

 

 

StateMachineBase의 CurrentState와 PreviousState는 아래처럼 쓸 수 있습니다.

 

 

플레이어의 인스펙터 뷰 입니다. InitialState에 원하는 State를 끌어놓고,

AnimationParameters에 원하는 애니메이션 파라미터 정보를 입력하면 됩니다.

 

반응형