Collider2D 동작 관련

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

게임 개발 동아리에서 지난 주말 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개의 댓글