캐릭터 이동
캐릭터 점프
캐릭터 충돌 여부
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);
}
위와 같이 수정하니 오류 메세지는 사라짐
이 점은 점프를 시작하면 bool을 이용해 rigidbody.gravityScale을 변경 시켰다.
private void Jump(Vector3 direction)
{
if(bJump) //점프 중이라면
{
rigidbody.AddForce(direction * jump, ForceMode2D.Impulse);
bJump = false;
rigidbody.gravityScale = 10.0f;
}
}
그러나 더 큰 문제가 있었는데
이게 뭐가 문제냐고 할 수 있는데, 대충 원하는 곳까지 점프 하는데 드는 힘이 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;
}
[내일 할 일]
맵 배치 시작