void Move()
{
rb.velocity = new Vector2(Input.GetAxis("Horizontal"), 0) * moveSpeed * Time.deltaTime;
}
void Jump()
{
//KeyCode.Space == "space"
if(Input.GetKeyDown(KeyCode.Space)) rb.AddForce(Vector2.up * jumpPower * Time.deltaTime, ForceMode2D.Impulse);
}
코드 요렇게 짰는데,
캐릭터 움직임이 아래랑 같음.
궁금한 거
1. 왜 이리 늦게 떨어지나?
2. 원래 개수를 moveSpeed나 jumpPower 같은 계수를 크게 줘야함? 유튜브에선 10정도만 줘도 점프 잘 하던데 난 안 그럼.
가속도 운동할 때 델타 타임 곱하는게 맞나
어디가 가속도 운동임? Velocity 건드는 건 사실 a=0인 등속도운동이잖아. AddForce에서 deltatime 빼봤는데 달라진 건 없네..
코드 그대로 해봤는데 멀쩡하게 잘 됨. 게임 뷰에서 해상도 결정하는 탭에서 VSync 체크되어 있는지 확인
떨어지는거 느린거는 프로젝트 설정에서 중력 가속도 값이 낮게 되어 있을지도 모름
감사감사 낙하는 일단 해결
중력 가속도를 -100으로 해야 겨우 무난한 수준인거면 혹시 스프라이트 크기가 너무 작은거 아닌지도 확인해보셈.
점프할 때 순간이동하는 원인 이동하면서 점프해서 그런거 같음
코드 보니까 이동할 때 velocity y값을 0으로 해버렸네. 저거 velocity를 0으로 만드는거임. rb.velocity.y 값으로 바꾸셈
스프라이트 크기는 어디서 확인할 수 있어? 일단 화면은 16:9 aspect이고, VSync 껐어. 사용한 스프라이트는 유니티 기본 스프라이트 네모 반갈죽해서 쓰는게 캐릭터야. 그래비티 스케일 1이고, 질량도 1인데 점프는 아직도 위에 움짤 같아.
오 부끄러운 실수네 ㅋㅋ; 일단 수정했고 점프도 일단 단발성으로 조정해서 테스트 해볼게 땡큐
난 Vsync를 키니까 너 코드 그대로 적용해봤는데 점프 멀쩡하게 잘 됨. Vsyc가 실제로 영향이 있는지는 모르겠지만 프레임이 불규칙해서 이상한 결과가 나오는 것 같기도 해서 키고 함.
델타 타임 왜 넣음?
델타타임 2갠데.. 어디 말하시는거? 움직임엔 넣어야하는거 아님?
델타 타임 넣으면 초당 업데이트 횟수에 연관받게 하겠다는건데, 애드 포스나 벨로시티나 업데이트 상관없이 쓸라고 쓰는건데
우선 델타타임 집어넣고 곱하면 소수점 0.01~0.02 곱한다고 생각하면됨. 기존 값을 엄청 낮추는건데 이거 왜 넣음?
아하.. 몰랐었음. 지우닌까 Move는 잘 작동함. 감사감사 근데 Jump는 아직도 순간이동처럼 점프되는데 gravityscale을 줄이자니 떨어지는 속도가 문제인데 이거 해결법도 아심??
우선 델타타임 넣은만큼 점프 파워 값을 줄여보고, 그래도 마음에 안들면 mass 파라메터 값 수정해보셈
아직도 점프하면 순간이동하는 것 처럼 보여.. 중력가속도 -100으로 해서 내려가는 속도는 무난한데
이런 문제가 있을땐 중력가속도를 건드리는게 아니고, 왜 이렇게 동작하는지 정확히 이해하는게 중요해.
https://docs.unity3d.com/ScriptReference/Rigidbody2D-velocity.html
이 문서를 보면 velocity는 일반적으로 직접 set하지 않고 force를 이용한다라고 되어있음.
velocity에 직접 set하는 것은 물리 시뮬레이션을 다 망가뜨리는거임. Unity 내부적으로 물리시뮬레이션하면서 중력가속도를 적용해서 새로 velocity를 계산해놨는데, Move에서 덮어씌워버리니까 중력이 무시되는 것처럼 보이는거임
게임이 물리시뮬레이션에 의해 돌아가게 만들고 싶으면
https://docs.unity3d.com/ScriptReference/Rigidbody2D.AddForce.html
이 함수를 써서 이동하도록 바꾸고, 그게 아니고 직접 모든 속도와 움직임을 컨트롤하고 싶다면 Kinematic으로 놓고 중력까지 직접 계산하는게 보통임.
아무래도 하나로 통일하는 것이 유리하긴 하겠네 감사감사
void Move() { rb.velocity = new Vector2(Input.GetAxis("Horizontal") * moveSpeed, rb.velocity.y); } void Jump() { if (Input.GetKeyDown(KeyCode.Space)) rb.velocity = new Vector2(rb.velocity.x, jumpPower); }
깔끔한 설명 감사
문제발생원인 1. Move함수 vector에 y 속도를 0으로 해놔서 점프가 계속 끊기고 순간이동 처럼 보이게 됨. 2. Move함수 x에 moveSpeed 계수를 줘야하는데 벡터 자체에 줘서 적용이 이상하게 됨. 3. 델타타임 넣어서 0.0n 정도의 값이 곱해져서 계수 값을 크게 줬어야 함. P.s. 가능하면 velocity보단 addforce 추천
원래 플랫포머의 낙하는 실제물리랑 많이 달라...
머가 다른지 설명점..