반응형
#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();
}