ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 FSM 유한 상태 머신 - 몬스터 상태 관리
    Unity 2024. 3. 19. 18:36
    반응형

    안녕하세요

    유니티 FSM을 이용한 몬스터 상태를 구현해봤습니다.


    [BaseState.cs]

    public abstract class BaseState
    {
        public abstract void StateEnter();
        public abstract void StateExit();
        public abstract void StateUpdate();
    }
    • 추상 클래스를 하나 만들어 줍니다.

     

    [EnemyState.cs]

    // 상태 종류
    public enum EEnemyState
    {
        Tracking,
        Attack,
        Die,
    }
    
    #region 변수
    private Enemy enemy;
    #endregion // 변수
    
    #region 프로퍼티
    public BaseState[] stateArray { get; private set; } // 상태 배열
    public BaseState currentState { get; private set; } // 현재 상태
    #endregion // 프로퍼티
    
    #region 함수
    /** 초기화 */
    private void Awake()
    {
        enemy = GetComponent<Enemy>();
    
        // 상태 크기 설정
        stateArray = new BaseState[3];
    
        // 상태
        stateArray[(int)EEnemyState.Tracking] = new EnemyTrackingState(this, enemy);
        stateArray[(int)EEnemyState.Attack] = new EnemyAttackState(this, enemy);
        stateArray[(int)EEnemyState.Die] = new EnemyDieState(this, enemy);
    }
    
    /** 초기화 */  
    private void Start()
    {
        // 시작 상태
        currentState = stateArray[(int)EEnemyState.Attack];
        currentState.StateEnter();
    }
    
    /** 초기화 => 상태를 갱신한다 */
    private void Update()
    {
        // 상태가 존재할 경우
        if (currentState != null)
        {
            currentState.StateUpdate();
        }
        else
        {
            Debug.Log(" 상태가 없습니다 ");
        }
    }
    
    /** 상태를 변경한다 */
    public void ChangeState(EEnemyState changeType)
    {
        if (stateArray[(int)changeType] == null) { return; }
    
        // 현재 상태가 존재할 경우
        if (currentState != null)
        {
            // 상태 종료
            currentState.StateExit();
        }
    
        // 상태 변경
        currentState = stateArray[(int)changeType];
        currentState.StateEnter();
    }
    #endregion // 함수
    • 열거형에 상태 종류를 나열하고, 종류에 맞는 상태 클래스를 stateArray에 저장합니다.

     

    [상태 클래스.cs]

    public class EnemyTrackingState : BaseState
    {
        #region 변수
        private EnemyState enemyState;
        private Enemy enemy;
        #endregion // 변수
    
        #region 생성자
        public EnemyTrackingState(EnemyState enemyState, Enemy enemy)
        {
            this.enemyState = enemyState;
            this.enemy = enemy;
        }
        #endregion // 생성자
    
        /** 상태 시작 */
        public override void StateEnter()
        {
            throw new System.NotImplementedException();
        }
    
        /** 상태 종료 */
        public override void StateExit()
        {
            throw new System.NotImplementedException();
        }
    
        /** 초기화 => 상태를 갱신한다 */
        public override void StateUpdate()
        {
            throw new System.NotImplementedException();
        }
    }
    • 상태 클래스를 만들어주고, 생성자를 생성하여 필요한 변수를 받습니다.
    • 상태 시작, 상태 종료, 상태 업데이트에 필요한것을 구현합니다
    • 상태를 변경할때는 enemyState.ChangeState(); 를 통해 상태를 변경해줍니다.

     

    [인스펙터]

    • 몬스터에 EnemyState 함수를 넣어줍니다.

     

     

    ※ 코드에 주석을 달아놔 이해하기 쉽게 했습니다. 코드를 분석해서 응용하여 사용하시면 됩니다.

    반응형
Designed by Tistory.