별 일 없을줄 알았는데, 월드 좌표를 UI 좌표로 바꿨을때 이생해져서 열심히 구글링을 한 결과, Render Mode에 따라 변환하는 방식이 다르다는것을 알게되었다.
Overlay 모드에서는 단순히
rectTransform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, target.position);
로 해결되었지만 Camera모드에서는 좀더 복잡한 계산이 필요하다
var pos = Vector2.zero; var uiCamera = Camera.main; var worldCamera = Camera.main; var canvasRect = canvas.GetComponent<RectTransform> (); var screenPos = RectTransformUtility.WorldToScreenPoint (worldCamera, target.position); RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPos, uiCamera, out pos); rectTransform.localPosition = pos;
참고 링크
일본 개발자들이 정리를 참 깔끔하게 하는것 같다. 번역도 편하고.