Collider2D 동작 관련

쌍제이(JJVoiture)·2024년 11월 12일

게임 개발 동아리에서 지난 주말 28시간 동안 게임잼 행사를 진행했다.
필자가 속한 팀은 아래와 같이 왼쪽의 화면을 통해 캐릭터를 조작하고, 오른쪽에서는 이동에 의해 선택된 미니게임을 플레이하는 두 개의 화면을 사용하는 방식의 게임을 제작하였다.

문제 상황

위 예시에서는 새 모양의 장난감이 떨어질 때 플레이어가 수평 방향으로 조작 가능한 손이 새 장난감과 접촉하면 클리어되는 미니게임인데, 오른쪽 화면을 Canvas UI로 제작하였다. Canvas 안에 있는 UI는 Collider2D component를 적용해도 collision event나 trigger event를 감지할 수 없다는 문제를 발견했다.

해결 방법

이미 시간이 많이 지나 미니게임 전체를 뒤엎을 수 없는 상황이어서 RectTransform을 이용하여 서로가 겹쳤는지를 판별하는 아래와 같은 코드를 작성하였다.

bool IsOverlapping(RectTransform other)
    {
        Rect rect1 = RectTransformToScreenSpace(_rectTransform);
        Rect rect2 = RectTransformToScreenSpace(other);

       return rect1.xMin <= rect2.xMax && rect1.xMax >= rect2.xMin &&
                          rect1.yMin <= rect2.yMax && rect1.yMax >= rect2.yMin;
    }

    Rect RectTransformToScreenSpace(RectTransform transform)
    {
        Vector2 screenPointMin = RectTransformUtility.WorldToScreenPoint(null, transform.TransformPoint(transform.rect.min));
        Vector2 screenPointMax = RectTransformUtility.WorldToScreenPoint(null, transform.TransformPoint(transform.rect.max));
        Vector2 size = screenPointMax - screenPointMin;

        return new Rect(screenPointMin, size);
    }

반성점

판단 착오로 여러대의 카메라를 한 화면에서 보여주는 게 불가능할 것이라고 생각하고, 기존의 코드를 뒤엎는 것이 힘들거라고 생각해서, 잘못 진행된 코드 위에 작업을 하니 오히려 시간이 오래 걸리고 버그가 발생했을 때, 원인 파악이 더 힘들었었다.
애초에 PoC를 제대로 했으면 2개 이상의 카메라 사용이 가능하다는 것을 파악했을 텐데 거기까지 생각이 미처 닿지 못했던 것 같다.
유니티는 내장 기능으로 구현된 훌륭한 기능이 많으니 PoC에 더 신경을 써서 개발을 하도록 노력해야겠다.

profile
안녕하세요. 중구난방 개발자 쌍제이입니다.

0개의 댓글