Unity3D/유니티 공부

State 패턴

상연 2022. 1. 16. 01:35

게임을 만들다보면, 하나의 캐릭터는 굉장히 많은 동작을 수행해야한다.

대기, 걷기, 뛰기, 앉기, 공격 등등등...

그런데 스크립트 상에서 이러한 동작을 전환시키려면 어떻게 해야할까?

 

각 상태별로 Boolean 변수를 만들어서 각 변수를 체크한다?

동작이 한 두개라면 쓸 수 있는 방법이겠지만, 동작이 많아지면 많아질수록 관리가 감당이 안될것이다.

 

이럴때 사용하는 방법이 바로 State 패턴.

 

public enum PlayerState
    {
        Die,
        Moving,
        Idle,
        Channeling,
        Jumpling,
        Falling,
    }

    PlayerState _state = PlayerState.Idle;

 

우선 이렇게 동작을 정의? 해준다.

void Update()
    {
        switch (_state)
        {
            case PlayerState.Die:
                //해당 동작에 수행할함수
                break;
            case PlayerState.Moving:
                //해당 동작에 수행할함수
                break;
            case PlayerState.Idle:
                //해당 동작에 수행할함수
                break;
        }
    }

이후, Update 등... 상태를 빠르게 확인해서 그 상태에 맞는 동작을 수행할수있게 해 주면 된다.

 

단점이라면, 동시에 두 가지 상태를 갖게 할 수 없다.

다만 한 번에 한 가지 동작을 수행하기에는 관리가 편하다.

 

State Machine

위의 방법으로 진행을 하면, Switch 문을 활용하여 각 상태에 따라 애니메이션이 동작하게 하거나, 원하는 위치로 이동한다던지, 공격을 한다던지 할 수 있다.

다만, 애니메이션의 경우에는 아래와 같이 Transition을 해서 전환을 할 수 있다.

 

? 스크립트를 사용하지 않고 왜 이렇게 하는가 ?

State가 많아짐에 따라서 스크립트로 조절을 하는것이 복잡해질수가 있다.

위와같이 시각적으로 보이는 것이 조금 더 직관적이라는 장점이 있다.

연결 선을 만들고

Parameter를 만들어준다.

이 Parameter는 코드와 애니메이터를 연결해주는 것이라고 생각.

따라서 코드상에서 이 애니메이터의 파라미터를 받아와서 값을 변경해주고

애니메이터는 그 변경된 파라미터의 값에 따라 애니메이션의 전환을 수행해주면 된다.

파라미터의 값에 따른 전환은 이와같이 해 주면 된다...


알쓸신잡

Has Exit Time 이란?

간단하게 생각하면, 동작이 끝나기까지의 시간이 생긴다는것.

일정시간이 지나면 해당동작이 끝나고 다음 동작으로 넘어가는데, Has Exit Time에 false를 하면 특별한 명령없이는 평생 그 동작만을 반복하게 될 것이다.

이렇게 여러가지 Transition이 연결되어 있다면 우선순위는?

- 중심이 되는 State의 Inspector에 가서 Transitions의 우선순위대로 동작한다.

+ 해당 포스팅은 Rokiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 들으며 개인적으로 이해에 도움이 되기위해 간단하게 정리를 한 내용입니다.