버그 해결을 위한 모든 질문을 던져
0 votes
156 views
void Update
{
OnKnockBack();
}

private void OnCollisionEnter(Collision collision)
{
  if (collision.gameObject.CompareTag("Player"))
     {
      // 플레이어와 부딪히면
      knockBackSpeed = 60.0f; // 넉백 스피드를 60으로
      }
}

private void OnKnockBack()
{
  if (knockBackSpeed <= 0)
     {
      knockBackSpeed = 0;
      return;
     }
     knockBackSpeed -= decreaseSpeed; // 넉백 스피드는 decreaseSpeed 등차수열
     player.Translate(Vector3.back * knockBackSpeed * Time.deltaTime); // 속도 감속하며 넉백
}

제가 구현하고 싶은 것은 충돌 시 자연스럽게 넉백하는 것입니다.

그런데 실행해보면 멈춰있는 오브젝트에 충돌하면 knockBackSpeed가 0이 될 때까지 계속 값이 감소하는데

움직이는 오브젝트에는 knockBackSpeed가 감소하다가 갑자기 0이 되고 몇 초후에 0이 되기 전 바로 직전 값이 knockBackSpeed에 들어가서 다시 감소하기 시작합니다.. 왜 이런 딜레이가 생기는건지 도저히 알 수가 없읍니다ㅠㅠ

애초에 knockBackSpeed가 0이 되면 계속 return되어서 다시 충돌하기 전까지는 값이 들어가지 않는데 말이죠..  

<!-- } SE-TEXT --><!-- SE-TEXT { -->
asked (2 point) , 156 views

1 답변

+1 vote
일단 저라면 OnKnockBack함수 내부를

if (knockBackSpeed > 0)
{
     knockBackSpeed -= decreaseSpeed; // 넉백 스피드는 decreaseSpeed 등차수열
     if (knockBackSpeed < 0) knockBackSpeed  = 0;

     // 위의 2줄은 min이었나 함수를 쓰면 한줄로 될텐데 유니티 안한지 1년이넘어서 기억이안나네요 ㅠㅠ
     player.Translate(Vector3.back * knockBackSpeed * Time.deltaTime); // 속도 감속하며 넉백

}

로 바꿀 것 같네요. 현재 코드를 보면 knockBackSpeed이 -값인채로 대입될 여지가 보입니다.

말씀하신 실제 상황은 음.. decreaseSpeed의 계산이나 주변 다른 상황까지 봐야 알겠네요.

제가 유니티했을때는 해당 변수를 선언 시 knockBackSpeed = 0; 이렇게 선언했던걸

knockBackSpeed { get; set; }으로 변경해서 set시에 로그를 찍어서 이상한 지점의 콜스택을 찾아봤었습니다.

도움이 되시면 좋겠습니다~
answered (17 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

424 질문
564 answers
572 댓글
38,662 users