반응형

유니티에서 UI 오브젝트의 위치를 이동할 때, 부모 오브젝트가 다르면 단순한 좌표 설정으로는 위치가 정확하게 맞지 않는 경우가 있습니다. 예를 들어, 미니맵 아이콘을 특정 UI 영역으로 옮기거나, 퀘스트 알림창을 다른 UI 위에 정확히 배치하려 할 때 이런 문제가 발생하죠.
이번 포스팅에서는 부모가 다른 UI 오브젝트 간에 정확하게 위치를 맞추는 방법을 소개합니다.
문제 상황
아래 코드는 한 UI 오브젝트인 TargetUI의 위치를 MovingUI로 옮기려는 예제입니다. 하지만 부모가 다르기 때문에 단순히 anchoredPosition으로 설정하면 UI 위치가 엉뚱한 곳으로 이동하게 됩니다.
RectTransform targetUI = GameObject.Find("TargetUI").GetComponent<RectTransform>();
RectTransform movingUI = GameObject.Find("MovingUI").GetComponent<RectTransform>();
// 단순한 위치 이동 시도 (부모가 다르면 제대로 동작하지 않음)
movingUI.anchoredPosition = targetUI.anchoredPosition;
해결 방법
- TargetUI의 월드 좌표를 가져옵니다.
- 이 월드 좌표를 MovingUI의 부모 기준 로컬 좌표로 변환합니다.
// TargetUI와 MovingUI의 RectTransform 가져오기
RectTransform targetUI = GameObject.Find("TargetUI").GetComponent<RectTransform>();
RectTransform movingUI = GameObject.Find("MovingUI").GetComponent<RectTransform>();
// 1. TargetUI의 월드 좌표 가져오기
Vector3 worldPosition = targetUI.position;
// 2. MovingUI의 부모 기준 로컬 좌표로 변환
Vector3 localPosition = movingUI.parent.InverseTransformPoint(worldPosition);
// 3. 변환된 로컬 좌표를 MovingUI에 적용
movingUI.localPosition = localPosition;
이렇게 하면 부모가 다른 UI 요소 간에도 정확한 위치 이동이 가능합니다.
예제 설명
- position: 월드 좌표 기준의 위치를 반환합니다.
- InverseTransformPoint: 월드 좌표를 특정 부모의 로컬 좌표로 변환해줍니다.
- localPosition: 부모 기준의 로컬 좌표를 설정합니다.
추가 고려 사항
- 앵커(anchor)와 피벗(pivot) 설정:
- 두 UI 오브젝트의 앵커와 피벗이 다르면 위치가 어긋날 수 있습니다.
- 앵커와 피벗을 동일하게 설정하거나, 필요에 따라 보정값을 추가하세요.
- 캔버스(Render Mode) 확인:
- Screen Space - Overlay: 월드 좌표 변환이 비교적 단순합니다.
- Screen Space - Camera 또는 World Space: 카메라 설정 및 캔버스 스케일링 설정에 따라 좌표 변환이 필요할 수 있습니다.
결론
- 부모가 다른 UI 오브젝트 간 위치 이동 시에는 월드 좌표 → 로컬 좌표 변환이 필수입니다.
- 이 방법을 통해 미니맵 마커, 퀘스트 알림창, UI 오버레이 효과 등을 정확하게 배치할 수 있습니다.
반응형