Unity - FSM(Finite State Machine)(2)

2024. 6. 18. 20:17Unity/Unity 학습정리

  이번에는 실제로 FSM을 이용해서 내가 원하는 동작을 State에 동작시키는 과정이다. State의 변화를 주어야하는 방법을 생각하고 해당 State에서 무엇을 해야하는지를 잘 고민하는게 중요한 것 같다. 

 

 

 


애니메이션 적용

먼저 애니메이션을 적용하기 위해선 유니티 에디터에서 애니메이션 연결을 해야한다. 

  그리고 애니메이션간 이동을 가능하게하는 Transition에서 Parameter를 두어 제어를 해야하는데, 이것 또한 StateMachine에서 동작 시킬 수 있다. 위 사진에는 Idle, Run, Attack 세 가지 상태에 따라서 해당 애니메이션을 제어하는 방식으로 사용했다. 추가적으로 한 상태에서도 두 개의 애니메이션을 쓸 수 도 있고 그것은 입맛에 따라 수정하면 될 것 같다.

public class PlayerAnimationData
{
    [SerializeField] private string idleParameterName = "Idle";
    [SerializeField] private string runParmeterName = "Run";
    [SerializeField] private string attackParameterName = "Attack";
 
    public int idleParameterHash { get; private set; }
    public int runParameterHash { get; private set; }
    public int attackParameterHash { get; private set; }

    public void Initialize()
    {
        idleParameterHash = Animator.StringToHash(idleParameterName);
        runParameterHash = Animator.StringToHash(runParmeterName);
        attackParameterHash = Animator.StringToHash(attackParameterName);
    }
}

  애니메이터의 Parameter를 관리하는 데이터를 두고 해당 String들을 Hash로 바꾸어 데이터를 저장한다. 이 클래스에 있는 데이터들은 나중에 StateMachine에서 사용한다.

   public class PlayerBaseState : IState
{
   	 protected void StartAnimation(int animatorHash)
     {
         stateMachine.player.animator.SetBool(animatorHash, true);
     }

     protected void StopAnimation(int animatorHash)
     {
         stateMachine.player.animator.SetBool(animatorHash, false);
     }
}

  PlayerBaseState에서 애니메이션을 동작시키는 함수를 Protected를 이용해 자식 클래스에게 사용 할 수 있도록 하고 PlayerBaseState를 상속받은 자식 State들은 (ex. IdleState, AttackState)들은 위 메서드를 통해 원하는 애니메이션을 해당 State에서 사용 한다.

public class PlayerChasingState : PlayerBaseState
{
    public PlayerChasingState(PlayerStateMachine stateMachine) : base(stateMachine)
    {
    }

    public override void Enter()
    {
        stateMachine.movementSpeedModifier = 10;
        base.Enter();
        Debug.Log("Chasing Mode");
        StartAnimation(stateMachine.player.AnimationData.runParameterHash);
        stateMachine.isChasing = true;

    }

    public override void Exit()
    {
        base.Exit();
        StopAnimation(stateMachine.player.AnimationData.runParameterHash);
        stateMachine.isChasing = false;
    }
 }

  실제로 이번 ChasingState에서 작성한 코드인데 StartAnimation이 Enter()에 들어가있고, StopAnimation이 Exit()에 들어가있어 해당 State에 진입할때 항상 작동하는 애니메이션을 지정해 줄 수 있다.

 Enter() 에서 밑에보면 isChasing boolean변수도 true로 바꿔주고 Exit()에서 False로 만들어주면서 쫒는 상태인지 안쫒는 상태인지 StateMachine에게 체크해 줄 수 있다.

 

다음 포스팅에서는 FSM을 프로젝트에 적용한 과정과 결과물을 보여주고 FSM을 공부하면서 느꼈던점을 적으면서 마무리할 예정이다.