jump aniamtion error

1. 키보드 키 누름 정도에 따라 점프 강도가 달라짐

-> jump animation이 진행될 떄, 본래의 collider보다 높은 위치에 animation이 재생된다. 이 때문에 일정 높이의 점프를 하지 않으면 collider에 미리 부딪혀 fall로 넘어가지 못하고 그대로 멈춰버린다. 이 문제를 해결하기 위해서 키보드 키 누름 정도와는 상관없이 일정한 높이의 점프가 가능해야 한다고 생각했다.

  • 먼저 의심해본 것은 input system. 하지만 input system manual에서는 button으로 처리 되어있어서 value 지속적인 값과는 달랐음.
  • 결국 rigidbody를 이용한 점프에서 문제가 있었다.
    처음에 사용한 api는
_rigidbody.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);

였다. addforce를 이용하면 일정한 속도가 아닌 힘이 벡터 방향을 따라 연속적으로 가해지므로 서서히 힘이 가해지는 구조였던 것이다. 그래서 다음과 같이 코드를 변경하였다.

_rigidbody.velocity = new Vector3 (_rigidbody.velocity.x, jumpHeight, _rigidbody.velocity.z);

https://docs.unity3d.com/Packages/com.unity.inputsystem@1.7/manual/Actions.html
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.7/api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase

2. jump sub state machine이 진행되는 동안 jump 키를 계속 누르고 있으면 모든 animation이 끝나지 않고 처음의 jump animation으로 돌아온다.


animation 코드가 다음과 같다.

if(_playerController.isJumping && !_playerController.isAir) _animator.SetTrigger(PlayerAnimParameter.IsJump);

isAir와 isJumping은 다음과 같이 처리가 되었다.

private void InitializeInputSystem() {
_jumpAction.performed += context => isJumping = true;
_jumpAction.canceled += context => isJumping = false;
}

private void OnCollisionEnter(Collision collision)
{
    if(collision.transform.CompareTag("Ground"))
        isAir = false;
}

private void OnCollisionExit(Collision collision)
{
    if(collision.transform.CompareTag("Ground"))
        isAir = true;
}

jump를 추적하는 isJumping은 jump 키가 눌리면 true로, jump 키를 누르지 않으면 false로 돌아가게 하였고
isAir와 같은 경우에는 ground로 tag가 된 gameobject와 충돌을 하지 않을 때 true, 그렇지 않을 때 true가 되게 하였다.

  • input system action 변환
    jump를 한 번 누르면 jump가 되게 하기 위해서는 일단 inputsystem의 action을 다른 것을 써야 했다.
    그래서 처음 input을 받을 때만 실행되는 started를 사용하였다.
_jumpAction.started += context => isJumping = true;

키 값이 계속해서 들어오지 않는 문제는 해결되었지만, 문제는 다른 곳에서 일어났다.

키를 계속 누르고 있으면 isJumping은 키를 뗄 때까지 true 상태가 되어있다.
animation이 전환되는 방식을 보면 isAir가 false일 때인데, 만약 점프를 성공한 후, player의 collider가
바닥과 닿게 되면 isAir의 값이 false로 변하고 isJumping은 여전이 true 값이기 때문에 land animation으로넘어가지 못하고 다시 jump animation으로 돌아왔다. (anistate에서 들어오므로)
이를 해결하기 위해서는 parameter값을 하나 더 만들어야 했다.

  • IsPlayingJumpAction parameter 추가
    sub state machine 내부의 모든 jump가 끝나지 않았음에도 계속해서 jump로 돌아가는게 문제였다면
    jump anction이 끝나기 전까지는 다시 못 들어오게 할 필요가 있었다. 그래서 모든 jump 단계가 끝났는지를 확인할 parameter, IsPlayingJumpAction을 추가하였다. bool type으로 jump를 시작하는 조건에 isJumping외에도 해당 parameter가 false 때를 추가하였고, isJumping과 마찬가지로 started에서 true로 바뀌도록 만들었다. 다시 parameter 값을 초기화할 때는 PlayerJump()에서 하도록 하였다.

다음과 같이 jump가 잘 수행됨을 알 수가 있다.

profile
NEWB!

0개의 댓글