[240124]TIL

응징·2024년 1월 24일
0

TIL

목록 보기
22/36
post-thumbnail

잔소리피하기 게임 구현

구현 목록

캐릭터 이동
캐릭터 점프
캐릭터 충돌 여부

문제 코드

문제1 : InvalidOperationException 오류 메세지

  • 점프값으로 vector3 값을 줬는데도 제대로 된 데이터가 들어오지 않았다는 메세지
InvalidOperationException: Cannot read value of type 'Vector2' from control '/Keyboard/space' bound to action 'Player/Jump[/Keyboard/space]' (control is a 'KeyControl' with value type 'float')
UnityEngine.InputSystem.InputActionState.ReadValue[TValue] (System.Int32 bindingIndex, System.Int32 controlIndex, System.Boolean ignoreComposites) (at ./Library/PackageCache/com.unity.inputsystem@1.6.3/InputSystem/Actions/InputActionState.cs:2808)
UnityEngine.InputSystem.InputAction+CallbackContext.ReadValue[TValue] () (at ./Library/PackageCache/com.unity.inputsystem@1.6.3/InputSystem/Actions/InputAction.cs:1944)
UnityEngine.InputSystem.InputValue.Get[TValue] () (at ./Library/PackageCache/com.unity.inputsystem@1.6.3/InputSystem/Plugins/PlayerInput/InputValue.cs:44)
InputController.OnJump (UnityEngine.InputSystem.InputValue value) (at Assets/Script/InputController.cs:30)
UnityEngine.InputSystem.LowLevel.<>c__DisplayClass7_0:<set_onUpdate>b__0(NativeInputUpdateType, NativeInputEventBuffer*)
UnityEngineInternal.Input.NativeInputSystem:NotifyUpdate(NativeInputUpdateType, IntPtr)
public void OnJump(InputValue value)
    {

        Vector3 jumpInput = value.Get<Vector3>();
        CallJumpEvent(jumpInput);
    }

InputValue value를 받는다고 해도 백터 값이 바로 원했던 대로 Y축이 up되는 백터가 될리 없는데 그걸 생각 못하고 있었다.

 public void OnJump(InputValue value)
    {

        Vector3 jumpInput = Vector3.up;
        CallJumpEvent(jumpInput);
    }

위와 같이 수정하니 오류 메세지는 사라짐

문제2 : rigidbody 떨어지는 속도

  • 중력에 의해 바닥으로 떨어지는 속도가 엄청나게 느림 (대략 4초정도)

이 점은 점프를 시작하면 bool을 이용해 rigidbody.gravityScale을 변경 시켰다.

private void Jump(Vector3 direction)
    {
        if(bJump) //점프 중이라면
        {

            rigidbody.AddForce(direction * jump, ForceMode2D.Impulse);
            bJump = false;
            rigidbody.gravityScale = 10.0f;
        }
    }

그러나 더 큰 문제가 있었는데

문제3 : 점프할 때 힘이 너무 많이 듬

이게 뭐가 문제냐고 할 수 있는데, 대충 원하는 곳까지 점프 하는데 드는 힘이 6000정도가 든다. 10이면 움찔하지도 않고 30정도 되야 포지션이 미세하게 변하는게 느껴진다.

처음에는 그럼 그냥 6000정도로 힘을 주면 상관 없겠다고 하겠지만 6000정도의 힘으로 짧은 거리에 도달해서 그런지 거의 텔레포트 수준으로 위치가 올라간다. (물론 완전히 텔레포트는 아니지만 그만큼 빠르게 도달해서 점프답지 않다는게 문제)

원인은 캐릭터 이동을 구현할때 Move함수에서 있었다.

private void ApplyMovment(Vector2 direction)
{
    var velocity = rigidbody.velocity;
    velocity.x = direction.x * 10; // x 속도 적용


    rigidbody.velocity = velocity;
}

private void Jump(Vector3 direction)
{
    if(bJump)
    {

        rigidbody.AddForce(direction * jump, ForceMode2D.Impulse);
        bJump = false;
        rigidbody.gravityScale = 10.0f;
    }
}

rigidbody.AddForce도 rigidbody.velocity에 값을 변경시켜주는 메소드중 하나인데 ApplyMovment는 매번 FixedUpdate에서 x값 뿐만 아니라 y값도 업데이트 한다는점이다

 private void ApplyMovment(Vector2 direction)
    {
        var velocity = rigidbody.velocity;
        velocity.x = direction.x * 10; // x 속도 적용

        // 유지되는 y 속도
        velocity.y = rigidbody.velocity.y;

        rigidbody.velocity = velocity;
    }

&

[내일 할 일]

맵 배치 시작

  • 에셋 팀원들에게 여쭤보기
  • 기본적인 틀 만 배치
profile
Unity 개발 위주로 정리합니다

0개의 댓글