2024. 6. 18. 20:17ㆍUnity/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을 공부하면서 느꼈던점을 적으면서 마무리할 예정이다.
'Unity > Unity 학습정리' 카테고리의 다른 글
Unity - Behaviour Tree (1) (0) | 2024.06.25 |
---|---|
Unity - FSM(Finite State Machine)(3) (0) | 2024.06.20 |
Unity - FSM(Finite State Machine)(1) (0) | 2024.06.17 |
Unity - 슬라이더바로 사운드 조절하기 (1) | 2024.06.05 |
Unity - Scriptable Object (0) | 2024.05.27 |