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: 유니티 엔진 강의를 들으며 개인적으로 이해에 도움이 되기위해 간단하게 정리를 한 내용입니다.