Unity 2D StatePattern

장현태입니다·2025년 6월 10일

이전에 2D 게임을 제작할 때 PlayerStatus - PlayerController로 구성해서 플레이어의 status에 따라 PlayerController에서 이벤트를 실행 해주었다.
이러한 방법을 하게된다면 클래스에서 많은 의존과 복잡한 구조를 가지기 때문에 StatePattern을 사용해서 코드를 단순화 해보자.

StatePattern

BaseState)

플레이어의 상태에 따른 변화를 의무적 또는 선택적으로 사용하기 위해 abstract와 virtual를 사용해서 구현, enum을 통해 상태를 구분해줄거임


StateMachine)

딕셔너리 형태로 enum 상태를 키, BaseState를 값으로 구현하고, BaseState에서 현재 상태를 받아온다. ChangeState에서는 바뀌는 상태를 넣어주는데 이 때 현재 상태는 BaseState에서 Exit()과 Enter()를 사용해준다.

각 상태에서 Update(monobehaviour가 없기 때문에 일반적으로 사용하는 update아님)함수로 현재 상태의 Update(BaseState의 Update)를 실행 해준다.

FixedUpdate의 경우 물리적인 효과가 있을 떄만 사용하도록 설정하였다


Player)

StateMachine의 딕셔너리에 들어갈 enum값과 실행시킬 상태패턴을 등록한다.


PlayerState)

PlayerState 자체에서 사용되는 Update의 경우 animator의 anyState라고 생각하면 된다.


// 밑의 클래스에서 player.animator.Play()에서 Player 애니메이션을 Hash로 만들어서 사용했음

PlayerIdle)

PlayerState상속을 받고 player의 정보를 받아와서 해당 물리가 있는지 먼저 판단한다
그리고 들어올 때 Hash를 사용한 애니메이션을 실행하고 움직임이 없기 때문에 vector2.zero를 플레이어의 움직임 정보에 할당한다.

base.Update를 사용해서 상위 클래스의 if문이 true일경우 그 동작을 먼저 실행하게 된다.
그리고 만약 해당 동작의 조건이 실행하게 되면 StateMachine의 상태가 변했다고 알리게 되고
-> 변한 상태의 클래스에서 Enter함수가 실행되게 된다.


Player_Walk)


Player_Jump)


Player_Attack)


Player_Ladder)

다음과 같이 상태패턴을 구현하였다.

0개의 댓글