티스토리 뷰
UI를 다루면서 가장 까다로운 것이 무엇인가 하면 보통은 '좌표'다.
RectTransform이 좌표 설정을 편하게 하기 위해서 있다는 것 만 해도 얼마나 좌표가 골머리 썩히는 지는 알 수 있을 텐데, UI에 각도라도 넣으면 삼각함수를 접목해야 하는 등, 진짜로 머리를 많이 쓰게 만드는 것이 '좌표'다.
그렇다면 그 중에서도 으뜸인 것은 무엇일까.
얼마 전 까지만 해도 난 'UI 기준 마우스 상대 좌표'라고 했을 것이다.
그도 그럴게, RectTransform 자체에는 '내부의 마우스 좌표를 구할 수 있는' 기능은 없으니까.
하지만 지금은 다르다. 그 이유를 한번 정리 해 보자.
RectTransformUtility
[참고 URL: https://docs.unity3d.com/6000.0/Documentation/ScriptReference/RectTransformUtility.html]
앞서 본인이 RectTransform에는 마우스의 상대 좌표를 계산하는 함수가 없다고 말한 적이 있다.
다만, 실제로는 RectTransform에 없을 뿐이지, 관련 기능은 있다.
위의 RectTransformUtility가 바로 그것으로, RectTransform과 연계해서 사용할 수 있는 몇 가지 기능을 가지고 있다.
실제로 이 함수들은 UI를 작업하는 데에 매우 유용한 함수들이니 만큼, 알아두는 것이 좋을 것이다.
Bounds CalculateRelativeRectTransformBounds(Transform root, Transform child)
child 오브젝트를 기준으로 child 오브젝트의 Bounds 객체를 반환하는 함수.
Bounds 객체: 각 꼭지점과 크기 등의 사각형 도형의 정보를 저장하는 클래스.
FlipLayoutAxes(RectTransform rect, bool keepPositioning, bool recursive)
x좌표와 y좌표를 모두 뒤집어 버리는 함수. x=y 반전과 유사하다.
keepPositioning이 true면 피벗을 기준으로 뒤집고, false면 상위 오브젝트를 기준으로 뒤집는다.
recursive가 true면 하위 오브젝트들도 함께 뒤집는다.
FlipLayoutOnAxis(RectTransform rect, int axis, bool keepPositioning, bool recursive)
상술한 FlipLayoutAxes와 유사하나, x라인이나 y 라인을 기준으로 뒤집는다.
axis가 0이면 수평(x), 1이면 수직(y)을 기준으로 뒤집는다.
Vector2 PixelAdjustPoint(Vector2 point, Transform elementTransform, Canvas canvas)
화면 상의 지점을 픽셀 좌표로 변환한다.
Rect PixelAdjustRect(RectTransform rectTransform, Canvas canvas)
canvas 상에서의 rectTransform의 각 꼭지점(4개)의 정보인 Rect 클래스를 반환한다.
bool RectangleContainsScreenPoint(RectTransform rect, Vector2 screenPoint, Camera cam = null)
cam을 기준으로, screenPoint가 rect 안에 있을 경우 true, 없다면 false를 반환한다.
bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint)
cam을 기준으로 screenPoint가 rect 안에 있는 지 여부를 반환하고, localPoint에는 rect 기준에서의 screenPoint의 좌표가 기록된다.
Ray ScreenPointToRay (Camera cam, Vector2 screenPos)
카메라 상의 screenPos 좌표에서 발사되는 Ray 정보를 반환한다.
bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector3 worldPoint);
cam 화면을 기준으로 screenPoint가 rect 안에 있는지를 반환한 뒤, worldPoint에 screenPoint의 worldSpace 좌표가 저장된다.
Vector2 WorldToScreenPoint(Camera cam, Vector3 worldPoint)
world Space 상의 좌표를 screen Space 상의 좌표로 치환하는 함수.
이 RectTransformUtility를 이용하면 UI 구성이 한층 편해진다.
특히 ScreenPointToLocalPointRectangle은 UI 대비 상대 좌표를 구현하기에 매우 유용하다.
그러니, UI를 작업하게 될 때 자주 쓰는 기능이 될 가능성이 높을 것이다.
이를 어떻게 활용할 수 있는지 한번 고민해 보는 것도 좋을 거 같다.
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learned - Day 87 [안드로이드 버전 호환성 대처법] (0) | 2025.01.16 |
---|---|
Today I Learned - Day 86 [모바일 화면 설정을 해 보자.] (0) | 2025.01.15 |
Today I Learned - Day 83 [UnityEditor의 함정] (0) | 2025.01.10 |
Today I Learned - 82 [지형 절차적 생성 - 구조 선택형] (0) | 2025.01.09 |
Today I Learned - Day 81 [Sorting Order에 대해서.] (1) | 2025.01.08 |