본문 바로가기
게임 개발

[Unity] BrickOutGame - 충돌 처리

by chobbo 2024. 5. 20.

 

오늘은 도움말 UI, 화면 전환 효과에 사용될 UI 디자인을 마치고 

사운드를 연결하였다. 

벽돌과 공, 패들 사이에서 발생하는 충돌처리를 팀 논의를 통해 해결하였다.

 

 

충돌 이슈

우리 팀의 게임에는 공과 패들이 충돌할 때 공의 속도가 우리가 의도한 대로 흘러가지 않는 큰 문제가 있었다.

문제는 Ball과 Paddle 각각에 Rigidbody2D 속성이 붙어있기 때문이었다.

 

두 가지 방법으로 해결하고자 하였다.

 

1. Paddle의 Rigidbody값을 제거하고 Paddle의 transform.position값으로 움직임을 제어

두 개의 Rigidbody값의 충돌로 인해 서로 값에 영향을 주며 발생하는 문제임으로

이와 같은 방법으로 수정 가능하였으나, 

패들과 벽의 충돌을 감지할 수 없어 Paddle의 transform.position.x값을

하드코딩으로 넣어주어야하는 또 다른 안좋은 점이 발생하였다.

// ex) 이런 비슷한 방법으로,, .FixedUpdate마다 검사해주어야함
if (transform.position.x > 2.9f)
{
    transform.position.x = 2.9f
}

너무 구려서 포기

 

2. Ball의 Rigidbody에 들어있는 바운스볼 속성 제거

바운스볼 Material이 내부적으로 속도를 마음대로 계산해버리기 때문에,

해당 속성을 제거하고 법선벡터 계산을 통해 입사각과 반사각을 구해 직접 넣어주는 방법을 사용할 수 있었다.

 

OnCollisionEnter2D 함수 내에 다음과 같이 normalVector 법선벡터를 구하고, 입사각을 구할 수 있었다.

Vector3 normalVector = collision.contacts[0].normal;
Vector3 reflectVector = Vector3.Reflect(dir, normalVector);

- collision.contacts[0].normal : 충돌체.충돌지점들의 첫번째 지점.법선벡터

 

해당 방법으로 코드를 작성하였으나 엄청난 예외 상황들이 발생했다.

해결하다가 더 좋은 아이디어가 생각났다.

 

3. Rigidbody끼리 충돌 시 velocity값 초기화

Physics Material 은 내부적으로 마찰과 탄성을 연산한다.
충돌하는 두 오브젝트의 마찰과 탄성이 합쳐지는 정도를 각각 연산!
이 연산 때문에 velocity가 순간순간 달라지기 때문에 발생한 문제였던 것!

 

따라서 ball과 paddle 충돌 시 실행되는 OnCollisionEnter2D함수 내에서
각각의 rigidbody.velocity값을 Vector3.zero로 초기화 한 후
rb2d.velocity = BallMovementDirection * speed; 코드를 작성하였더니 문제를 해결했다.

 

BallMoveMent.OnCollisionEnter2D

private void OnCollisionEnter2D(Collision2D collision)
{
    AudioManager.Instance.BallCollisionAudio();
    if (collision.gameObject.layer == 6)
    {
        rb2d.velocity = Vector2.zero;
        rb2d.velocity = BallMovementDirection * speed;
    }
}

 

 

PaddleMoveMent.OnCollisionEnter2D

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.layer == 9)
    {
        movementRigidbody.velocity = Vector3.zero;
    }
}

 

관련 레퍼런스 주소

 

Unity - Manual: Physic Material asset reference

Create and apply a custom Physic Material Physic Material asset reference Switch to Scripting The Physic Material is a material asset that you can place on a GameObjectThe fundamental object in Unity scenes, which can represent characters, props, scenery,

docs.unity3d.com

 

시작화면

시작화면

 

 

도움말 UI

도움말 UI

 

스코어보드 반영

GameScene

 

일시정지 화면

 

 

 

귀여운 5조 헤헤