private float timer = 0f;
private float maxJumpTime = 1f;
private bool isNoMoreJump = false;
[SerializeField] private float jumpForce; //현재 1입니다.
private Rigidbody2D rigid;
private void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
private void Update()
{
if (Input.GetButton("Jump") && !isNoMoreJump)
{
Jump();
}
if (Input.GetButtonUp("Jump"))
{
EndJump();
}
}
public void Jump()
{
if(timer < maxJumpTime)
{
timer += Time.deltaTime;
rigid.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
}
else
{
EndJump();
}
}
public void EndJump()
{
timer = 0f;
isNoMoreJump = true;
}
구성은 이렇게 해놓았는데, 스페이스바를 누르는 순간 떼던 말던 y좌표가 끝도 없이 증가하더라고요..
EndJump를 통해서 제동을 걸어두려고 한건데 제동도 안걸려 당황스럽네요
혹시 원인이 무엇인지 알 수 있을까요?
리지드바디 적용했음?
네. 깜빡하고 rigid관련 부분을 빼먹고 올렸네요
본문 수정했습니다. getbutton으로 한 이유는 스페이스바 누른 시간에 따라 점프높이 다르게 하려고 한거였는데.. 구현이 여렵네요
높은 확률로 isNoMoreJump 문제이니 한번 살펴보셈
아니다 transform.up 있지? 이거 Vector3.up 으로 바꾸셈
update내에서 Jump함수 호출시에 !isNoMoreJump를 조건으로 걸어뒀는데, EndJump에서 isNoMoreJump를 참으로 변경했으니, Jump함수 호출 조건 불충족 되는 것이 아닌가요?
addForce문제인가요..
조언주신대로 Vector3.up으로 바꾸어봤는데도 로켓되는 문제는 그대로네요.. 혹시 jump함수의 호출은 끝났지만, 남아있는 관성때문에 올라가는건가요?
public void EndJump() { timer = 0f; isNoMoreJump = false; }
update내에서 isNoMoreJump의 부정을 판별해서 false로 바꾸면 참조건이 되버리더라고요
이부분도 잘못된거같은데? false에서 true 일때 점프하게 만들었으면 다시 false로 와야하지 않음? - dc App
아 그런거였나요 다시 바꿔보겠습니다
addforce가 버튼 누르는 수 프레임 동안 계속 중첩해서 힘이 누적되는거 아닌가 싶은데 jumpForce에 Time.deltaTime 곱하면 해결되지 않을까
jumpForce를 1초 동안 버튼 눌렀을 때 적용되는 힘의 크기로 만드는거
그러면 오래 누르면 누를수록 오히려 더 빠르게 점프할 것 같아서..
아 아니면 deltatime으로 나누면 되겠네요
deltatime으로 나눈걸 addforce에 적용하면 자연스럽지 않을까요
댓글에 그렇게 썻잖어ㅋㅋ
아 곱한다고 알아들어서 시간 지날수록 힘이 더 세지는건줄 알았습니다..
jumpForce * Time.deltaTime 해야 되니까 곱한다고 했음ㅋㅋ deltaTime 0.x 소수점으로 나오는 값이니까 jumpForce / deltaTime 하면 안돼ㅋㅋ
getbutton말고 getbuttondown을해야 1번만 실행돼요. 임펄스를 매프레임마다 실행하시니 아마 폭발적으로 올라갈거라 예상합니다. - dc App
rigid.AddForce(transform.up * jumpForce, ForceMode2D.Impulse); 이게 계속 들가니까 문제지 꾹 누르면 점프되게하고 떼면 딱 브레이크 걸리게 하고 싶은거같은데 addforce말고 getcomponent.velocity=jumpspeed 이걸로 하셈 님이 원하는 대로 될거임
Addforce 같은 경우엔 단발성으로 호출하는게 좋음 5만큼 힘을 주면 5만큼 지가 알아서 감 ㅇㅇ