-
유니티 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 함수를 넣어줍니다.
※ 코드에 주석을 달아놔 이해하기 쉽게 했습니다. 코드를 분석해서 응용하여 사용하시면 됩니다.
반응형'Unity' 카테고리의 다른 글
유니티 웅크리기 구현 - 플레이어 웅크리기 (0) 2024.02.03 유니티 움직임 구현 - 플레이어 이동 및 점프, 1인칭 시점 (0) 2024.01.25 유니티 인벤토리 - 인벤토리 시스템 (0) 2024.01.23 유니티 데이터 저장/불러오기 - Json 데이터 저장/불러오기 (0) 2024.01.22 유니티 DOTween - 알림창 만들기 (0) 2024.01.18