말감로그

[Unity] UI 위에 게임 오브젝트 띄우기 본문

Unity

[Unity] UI 위에 게임 오브젝트 띄우기

habbn 2025. 5. 17. 02:41
728x90

 

UI 아래에 오브젝트가 깔리는 이유는 렌더링 순서 때문이다.

UI는 기본적으로 Canvas에서 관리되고, Canvas가 Screen Space - Overlay 모드면 UI가 무조건 가장 위에 렌더링된다.

반면, 게임 오브젝트는 보통 월드 공간(World Space)에 있고, 카메라가 렌더링하는 순서에 따라 뒤에 그려질 수 있다.

 

해결 방법

https://rito15.github.io/posts/unity-memo-gameobject-over-ui/

 

유니티 - UI 위에 게임오브젝트 띄우기

Preview

rito15.github.io

 


 

 

이 방법으로 게임 오브젝트를 UI 위로 띄우는 것에 성공했지만

게임 오브젝트를 드래그 시 오브젝트가 따라오지 않는 문제가 발생했다.

 

기존 Render Mode : Screen Space - Overlay 에서는

private Vector3 GetMouseWorldPos()
{
    Vector3 mousePoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    mousePoint.z = 0;
    return mousePoint;
}

 

UI가 실제 화면 픽셀(스크린 좌표)에 1:1 로 매핑된다.

즉, Input.mousePosition(스크린 좌표)이 가리키는 위치와 UI의 위치가 직접적으로 일치했기 때문에

굳이 z값을 맞춰주지 않아도 거의 정확하게 매칭되었다.

 

ScreenToWorldPoint()는 스크린 좌표로 바꾸기 위해 z값이 필요하다.
z는 "카메라로부터 얼마나 떨어진 거리에서 변환할 건지"를 의미함
따라서 드래그 대상 오브젝트의 z를 기준으로 설정해야 정확한 위치로 옮겨진다.

 

 

그러나 지금은 Render Mode : Screen Space -  Camera 로 

private Vector3 GetMouseWorldPos()
{
    Vector3 mousePos = Input.mousePosition;

    // 현재 오브젝트가 카메라에서 얼마나 떨어져 있는지
    mousePos.z = Camera.main.WorldToScreenPoint(transform.position).z;

    // 마우스 위치를 MainCamera 기준 월드 좌표로 변환
    Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);

    return worldPos;
}

 

UI 기준이 아니라 MainCamera 기준의 좌표계로 변환된다.

그래서 z값 없이 변환하면 엉뚱한 곳의 위치로 가게 된다.

 

따라서 현재 오브젝트가 카메라에서 얼마나 떨어져 있는지 정확한 위치를 계산한 후 마우스 위치를 월드 좌표로 변환해야 한다.

 

728x90

'Unity' 카테고리의 다른 글

[Unity] Cinemachine Collider  (0) 2025.05.01
네트워크 동기화  (0) 2025.02.22
[Unity] 디자인 패턴 - 오브젝트 풀링  (0) 2025.02.20
[Unity] DOTween  (0) 2025.02.05
[Unity] 유니티 성능 최적화 방법 (렌더링, 메모리)  (0) 2025.01.10