문제
UCanvasPanelSlot* TextSellingPriceCanvasSlot = Cast<UCanvasPanelSlot>(TextBlock_SellingPrice->Slot);
TextSellingPriceCanvasSlot->SetPosition(FVector2D(SellingPricePosX, 954.5f));
위와 같이 위젯 컴포넌트의 위치를 지정했을 때, 실제로 대입한 X값과 약간의 오차가 있었다.
해결
UCanvasPanelSlot* TextSellingPriceCanvasSlot = Cast<UCanvasPanelSlot>(TextBlock_SellingPrice->Slot);
TextSellingPriceCanvasSlot->SetDesiredPosition(FVector2D(SellingPricePosX, 954.5f));
SetPosition을 SetDesiredPosition로 변경하였더니 해결되었다.
SetPosition의 동작 방식
위젯의 렌더 트랜스폼을 조작
- SetPosition은 위젯의 렌더 트랜스폼(위젯의 시각적 위치)을 직접 설정한다.
UWidget::RenderTransform.Translation 값을 변경하여, 위젯의 화면 상 위치를 조정한다.
- 렌더 트랜스폼은 실제 레이아웃(슬롯 기반 위치)에 영향을 주지 않고, 시각적으로만 위치를 이동시킨다.
- 따라서 렌더링 트랜스폼만 조정해야 할 특별한 상황(애니메이션 등)에만 사용하는 것이 좋다.
레이아웃 무시
- 위젯의 슬롯(Canvas Slot 등) 위치는 변경되지 않으며, 위젯의 트랜스폼만 수정된다.
따라서 레이아웃 시스템에서 관리하는 좌표계와 충돌하거나 예상치 못한 오프셋이 발생할 수 있다.
SetDesiredPosition의 동작 방식
위젯의 예상 위치 설정
- SetDesiredPosition은 위젯의 레이아웃 및 위치를 결정하는 시스템에서 의도된(Desired) 위치를 설정하는 데 사용한다.
- 보통 드래그 앤 드롭 같은 상황에서 사용되며, 위젯의 DesiredSize와 Slot 위치를 동시에 조정한다.
- 레이아웃 시스템과 조화를 이루기 때문에 충돌 없이 올바른 위치에 배치된다.
- 따라서 레이아웃 시스템에 따라 위젯 위치를 설정해야 할 때 사용하는 것이 좋다.
슬롯과 트랜스폼 동기화
- 위젯의 슬롯 위치를 조정하는 방식으로 작동한다.
따라서 UCanvasPanelSlot과 같은 슬롯 시스템을 사용할 때 더 자연스럽게 동작한다.