// ..
if (const APlayerController* PlayerController = GetOwningPlayer())
{
// WorldPosition을 Screen r기준으로 Projection
// 이 때 기준은 전체 화면 기준
FVector2D TargetScreenPosition;
PlayerController->ProjectWorldLocationToScreen(WorldLocation, TargetScreenPosition, true);
if (UCanvasPanelSlot* IndicatorSlot = Cast<UCanvasPanelSlot>(IndicatorOverlay->Slot))
{
// TargetScreenPosition이 전체화면(ViewportSize) 기준으로 연산된 것이기 때문에,
// Canvase Size가 달라지면 Widget의 위치가 달라질 수 있다
int32 SizeX, SizeY;
PlayerController->GetViewportSize(SizeX, SizeY);
const FVector2D ViewportSize(SizeX, SizeY);
const FVector2D CanvasSize = GetCachedGeometry().GetLocalSize();
// 그래서 ViewportSize로 나눈 뒤 CanvasSize를 곱해서 위치를 재조정해준다
const FVector2D PositionOnCanvas = TargetScreenPosition / ViewportSize * CanvasSize;
IndicatorSlot->SetPosition(PositionOnCanvas + ScreenOffset);
}
}