ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 13주차 2일 FSM에서 신경써야 할 부분 ( 트러블 슈팅 )
    개발일지/스파르타 코딩클럽 부트캠프 2024. 7. 9. 18:20

     

    FSM을 사용한다는 건 많은 애니메이션을 사용한다는 것이다.

    그렇다보면 갖가지 이유로 버그가 발생하곤 한다.

    나만해도 Has Eixt Time 만으로도 수많은 버그가 발생했었다.

     

    트러블 슈팅

     

    오늘 해결한 문제

     

    1. 플레이어가 떨어지면서 1프레임 IdleState가 되는 현상

    2. 플레이어가 달리면서 점프하면 중간에 갑자기 멈춰서 뚝 떨어지는 현상

    3. 플레이어가 제자리에서 점프하면 공중에서 움직여지지 않는 현상

     

    첫 번째의 경우에는

    public override void Update()
    {
        base.Update();
    
        if(stateMachine.Player.Rigidbody.velocity.y <= 0)
        {
            stateMachine.ChangeState(stateMachine.IdleState);
            return;
        }
    }

    내가 JumpState일 때 Rigidbody.velocity.y가 0과 같거나 작으면 아이들 상태로 돌아가게

    초기에 코드를 짜 놨었는데, 저렇게 하면 공중에서 Rigidbody.velocity.y가 0과 같거나 작은 상태가

    잠깐이라도 나오게 된다. 그래서

    public override void Update()
    {
        base.Update();
    
        if(stateMachine.Player.Rigidbody.velocity.y <= 0)
        {
            stateMachine.ChangeState(stateMachine.FallState);
            return;
        }
    }

    IdleState를 FallState로 바꾸니까

    공중에서 1프레임씩 아이들애니메이션이 나오던게 사라지고

    달리다가 점프했을 때 공중에서 멈춰서 떨어지는 현상도 함께 사라졌다

     

    세 번째 문제는

    public override void Enter()
    {
        stateMachine.MovementSpeedModifier = 0f;
        base.Enter();
        StartAnimation(stateMachine.Player.AnimationData.IdleParameterHash);
    }

    IdleState의 Enter부분(IdleState가 시작하는)에 이동속도를 0으로 만들어주는 로직이 있었는데

    해당 로직이 이유는 모르겠으나.. JumpState로 바뀌어도 이동속도가 유지되는 것 같았다.

    그래서 IdleState의 부모가 PlayerGroundState인데 해당 스크립트에서

    점프 시에 이동속도를 주는 것으로 바꿨고

    달리다가 점프하는 것과 분별력을 주기위해 조건문을 통해 속도가 0일 때만 속도를 주는 것으로 바꿨다.

    protected override void OnJumpStarted(InputAction.CallbackContext context)
    {
        if(stateMachine.MovementSpeedModifier == 0 )
        {
            stateMachine.MovementSpeedModifier = 1f;
        }
        base.OnJumpStarted(context);
        stateMachine.ChangeState(stateMachine.JumpState);
    }
Designed by Tistory.