public Rigidbody2D rb; // 공의 rigidbody
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Wall"))
{
Vector2 reflectedVelocity = Vector2.Reflect(rb.velocity.normalized, collision.contacts[0].normal);
rb.velocity = reflectedVelocity * speed;
}
}
공의 velocity의 방향을 입사각, 충돌체의 법선(수평)을 기준으로 반사한 방향으로 설정하면 될거라고 생각했다.
하지만 다음 움짤처럼 부자연스럽게 공이 튕겨 날아가버렸다...
원리가 잘못된건지, 코드의 오류인지 갈피를 못 잡고 엉뚱한 부분만 수정했었다.
Update에서 강제로 velocity의 speed를 일정하게 고정시켜도 보고, paddle과 충돌할 때 수치도 조정해보고...
하지만 공의 velocity를 디버깅해보니 충돌 할 때의 velocity를 사용하는 것이 문제였다.
수평 충돌 할 때의 velocity의 y 방향 성분은 0으로 나오기 때문이다.
디버깅이 늦은 이유는 AI에게 질문했을 때 맞는 코드라고 해줘서 다른 부분에서 문제를 찾으려고 했었다.
문제점을 명확하게 찾으니 해결법은 간단했다.
Vector2 direction = rb.velocity.normalized;
var lastVelocity = collision.relativeVelocity;
direction = Vector2.Reflect(lastVelocity.normalized, rb.velocity.normalized);
rb.velocity = direction * speed;
충돌 직전의 상대 속도(collision.relativeVelocity)값을 이용하여 수정해주었다.
충돌 직전의 상대 속도를 입사각으로 설정하고 충돌할 때의 방향을 기준으로 반사시키니 자연스레 튕긴다!!!