DarkNaku / FiniteStateMachine

단순한 계층 유한 상태 머신(HFSM : Hierarchical Finite State Machine) 라이브러리 입니다.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FiniteStateMachine

단순한 계층 유한 상태 머신(HFSM : Hierarchical Finite State Machine) 라이브러리 입니다.

목적

  • 간단한 HFSM이 필요했으나 보통은 전환(Transition)을 통한 상태 변환을 하는 라이브러리 밖에 찾을 수가 없어서 제가 원하는 형태로 만들어 보았습니다.

사용

  1. 상태를 정의할 타입을 선언합니다. (문자열을 사용해도 됩니다.)
public enum STATE { NONE, IDLE, REST, EAT, SLEEP, MOVE, ATTACK, DEAD }
  1. 상태 클래스와 서브 머신 클래스를 구현해 줍니다. (나머지 코드는 샘플을 확인하세요.)
    // 상태가 전환되고 1초 후에 서브 머신의 EAT 상태로 전환 됩니다.
    public class RestState : BaseState<STATE>
    {
        public override STATE State => STATE.REST;

        private float _enterTime;

        public override void Enter()
        {
            Debug.Log($"Enter : {GetType()}");
            _enterTime = Time.time;
        }

        public override void Update()
        {
            if (Time.time - _enterTime > 1f)
            {
                FSM.ChangeState(STATE.EAT);
                return;
            }
        }
    }
    .
    .
    .
  1. FSM을 생성하고 상태를 추가합니다. (서브 스테이트 머신도 동일한 타이밍에 생성하여 추가합니다.)
using DarkNaku.FSM;

private FiniteStateMachine<STATE> _fsm;

private void Start()
{
    _fsm = new FiniteStateMachine<STATE>();
    var idleFSM = new FiniteStateMachine<STATE>(STATE.IDLE); // 서브 스테이트 머신 선언
    idleFSM.AddState(new RestState(), new EatState(), new SleepState());
    _fsm.AddState(idleFSM, new MoveState(), new AttackState(), new DeadState()); // 서브 스테이트 머신은 다른 상태와 동일하게 추가
    _fsm.SetStartState(STATE.IDLE);
    _fsm.Initialize();
}
  1. 업데이트 주기마다 호출 FSM 갱신을 호출해 줍니다.
private void Update()
{
    _fsm.Update();
}

부가설명

  • Transition은 지원하지 않습니다.
  • Enter 이벤트 내부에서 ChangeState를 호출하여 프레임 손실 없이 상태를 전환 할 수 있으나 무한루프에 빠질 수 있으니 주의 하세요.(추후에 방지 코드를 넣을 예정)
  • 서브 스테이스에서는 ParentFSM 속성을 통해 상위 머신에 접근할 수 있습니다.

About

단순한 계층 유한 상태 머신(HFSM : Hierarchical Finite State Machine) 라이브러리 입니다.

License:MIT License


Languages

Language:C# 100.0%