본문 바로가기
개발더미

[개발더미][Unity] FSM

by 스테디코디스트 2023. 7. 24.
반응형
#region FSM
    // FSM을 사용한 이유
    // 1. 직관적 -> 상태를 알아보기 쉬움
    // 2. 명확성 -> 상태별 수행 동작이 명확하게 분리됨
    // 3. 예방 -> 상태가 겹치는 오류 발생 사전 차단
    protected enum State
    {
        Idle, Move, Attack, Dead
    }
    [SerializeField] protected State myState;
    
    protected override void ChangeState(State changeState)
    {
        // 캐릭터의 상태를 바꾸는 함수
        if (changeState == myState) return; // 같은 상태로 변경하는 경우

        myAnim.SetBool(myState.ToString(), false);
        myState = changeState;

        // 변경될 때만 동작
        switch (myState)
        {
            case State.Idle:
                myAnim.SetBool("Idle", true);
                break;
            case State.Move:
                myAnim.SetBool("Move", true);
                break;
            case State.Attack:
                myAnim.SetBool("Attack", true);
                break;
            case State.Dead:
                myAnim.SetTrigger("Dead");
                break;
        }
    }

    protected override void StateProcess()
    {
        // 현재 상태에 따라 행동을 결정 -> Update()함수에서 매 프레임마다 실행
        switch (myState)
        {
            case State.Idle:
                break;
            case State.Move:
                break;
            case State.Attack:
                break;
            case State.Dead:
                break;
        }
    }
#endregion 
    
    private void Update()
    {
        StateProcess();
    }