게임 개발

유니티 FSM(유한상태머신) 이란????

오리의테크 2022. 1. 20. 13:45
728x90
반응형

유한 상태 머신(Finite State Machine, FSM)은 게임 에이전트에게 환상적인 지능을 부여하기 위한 선택 도구로 사용되어왔다.

다시 말해, 유한 상태 머신은, 주어지는 모든 시간에서 처해 있을 수 있는 유한개의 상태를 가지고 주어지는 입력에 따라 어떤 상태에서 다른 상태로 전환하거나 출력이나 액션이 일어나게 하는 장치 또는 그런 장치를 나타낸 모델이다.

상태(State): 게임에 정의된 여러 동작, 적 캐릭터뿐만 아니라 게이머에게도 적용될 수 있다.

  • Idle, Run, Attack, ... , 공격할 수 없는 상태, 캐릭터의 마나가 없어 마법 공격할 수 없는 상태 등
  • 한 상태에서 다른 상태로 전화할 수 있고, 동시에 여러 상태를 실행할 수는 없다.

전이(Transition): 한 상태에서 다른 상태로 전화하는 것

  • 각 상태 로직 또는 외부에서 전이 조건에 의해 전이될 수 있다.


장점

  • AI 개념을 프로그래머 외에 기획자 또는 제 3자가 쉽게 확인/설계 할 수있다.
  • 직관적이다.
  • 오류가 발생할 시 수정이 간편하다.

단점

  • 확장이 힘들다. (FSM의 상태를 계속 추가하다 보면 다시 연결하기가 머리 아프다.)

Player 클래스 스크립트 예시

 

public class Player : MonoBehavior {

 

private IState currentState;

private SpriteRenderer PlayerRenderer;

private Vector3 Direction;

 

private void Awake() 

{

//idleState를 시작해줍니다.

SetState(new IdleState());

}

 

private void Update() 

{

// state의 update를 호출하는 부분입니다. 

// 여기서는 꼭 update가 아닌 코루틴으로 리팩토링해도 좋을것같다는 생각을 했습니다.

currentState.Update();

}

 

 

public void SetState(IState nextState) 

{

// 다음 state로 이동구현

 

if(currentState != null) 

{

// 기존의 상태가 존재했다면 OnExit()호출

currentState.OnExit();

}

 

// 다음state 시작

currentState = nextState;

currentState.OnEnter(this);

}

 

 

// state에서 필요한 함수를 player에서 구현해 호출하는식으로 진행하면 될것 같습니다.

}

 

IdelState 구현 스크립트 예시

 

public class IdleState : IState {

private Player player;

void IState.OnEnter(Player player)

{

//player 프로퍼티 초기화

this.player = player;

// 초기화 구현

}

void IState.Update()

{

               // 실행할것 구현

if(이동키입력) 

{

// 다른상태로 이동

player.SetState(new MoveState());

}

}

void IState.OnExit()

{

//종료되면서 정리해야할것 구현

}

}

 

정의할 상태들의 인터페이스 IState 예시

 

public interface IState

{

// 인터페이스로 구현함으로써 player클래스에서 이 인터페이스로 호출합니다.

void OnEnter(Player player);

void Update();

void OnExit();

}

OnEnter는 상태가 시작될때 호출됩니다.  player클래스를 파라미터로 받아오면서 각 state클래스안에서 player에 접근시킬 수 있습니다.

(현재는 player의 색깔만을 변화시켜주지만 후에는 애니메이션, 프로퍼티등에 접근할수있을것같습니다.)

 

Update()는 상태가 유지되는동안 계속 호출해주는 함수입니다. 조건체크나 계속수행해줘야할것들을 구현합니다.

 

onExit()은 상태를 탈출하면서 호출됩니다. 초기화해줄것이나 제거할것들을 여기서 구현합니다.

 

이런식으로 FSM은 쉽게 확인과 설계가 가능하고 수정하기도 간편합니다. 

단, 너무 많은 상태를 추가하는것은 오히려 코드를 꼬이게 만들 수 있다.

728x90
반응형