작성 맥락
이 글은 직접 학습하거나 구현하며 남긴 개인 기술 기록입니다. 참고 자료가 있는 경우 본문에 출처를 남기고, 틀린 부분을 발견하면 수정합니다.
Unity Camera WorldToScreenPoint
WorldToScreenPoint는 3D 월드 좌표를 2D 스크린 좌표로 변환하는 메소드다. UI를 3D 오브젝트 위치에 맞출 때 쓴다!
기본 사용법
public Vector3 Camera.WorldToScreenPoint(Vector3 position);
- 입력: 월드 좌표 (Vector3)
- 출력: 스크린 좌표 (Vector3)
- x, y: 화면 픽셀 좌표
- z: 카메라로부터의 거리 (0보다 작으면 카메라 뒤)
좌표계 이해
월드 좌표
- 유니티의 3D 공간 좌표
- 원점 (0,0,0) 기준
- 예: (5, 10, 0)
스크린 좌표
- 화면 픽셀 좌표
- 좌하단 (0, 0), 우상단 (Screen.width, Screen.height)
- 예: 1920x1080 화면에서 (960, 540) = 화면 중앙
기본 예시
using UnityEngine;
public class WorldToScreenExample : MonoBehaviour
{
public Camera mainCamera;
public Transform targetObject;
void Update()
{
Vector3 screenPos = mainCamera.WorldToScreenPoint(targetObject.position);
Debug.Log($"스크린 좌표: {screenPos}");
}
}
뷰포트 좌표 vs 스크린 좌표
- 뷰포트 좌표: (0,0) ~ (1,1) 범위로 표현
- 스크린 좌표: 픽셀 단위
메소드:
WorldToScreenPoint: 월드 → 스크린WorldToViewportPoint: 월드 → 뷰포트
활용 예시
3D 오브젝트 위에 UI를 표시할 때 사용한다:
using UnityEngine;
using UnityEngine.UI;
public class WorldUI : MonoBehaviour
{
public Camera mainCamera;
public Transform targetTransform;
public RectTransform uiElement;
void Update()
{
// 월드 좌표를 스크린 좌표로 변환
Vector3 screenPos = mainCamera.WorldToScreenPoint(targetTransform.position);
// 카메라 앞에 있을 때만 표시
if (screenPos.z > 0)
{
uiElement.gameObject.SetActive(true);
uiElement.position = screenPos;
}
else
{
uiElement.gameObject.SetActive(false);
}
}
}
실제 사용 예시
private void LateUpdate()
{
if (targetTransform == null)
{
Destroy(gameObject);
return;
}
// 월드 좌표 → 스크린 좌표 변환
Vector3 screenPosition = Camera.main.WorldToScreenPoint(targetTransform.position);
// UI를 스크린 좌표 + distance 위치에 배치
rectTransform.position = screenPosition + distance;
}
LateUpdate 사용 이유: 오브젝트 위치가 Update에서 갱신된 후 UI 위치를 최종적으로 맞추기 위함
정리
WorldToScreenPoint는 3D 오브젝트를 2D UI와 연결할 때 필수다. 체력 바, 퀘스트 마커, 조준선 등에 유용하게 쓸 수 있다!
댓글이 보이지 않으면 GitHub에 로그인한 뒤 새로고침해 주세요. 공개 댓글은 로그인 상태에서 더 안정적으로 표시됩니다.