유니티 강좌를 듣다 보니 마우스의 좌표를 받아 오브젝트를 마우스와 동기화하는 데에 다음과 같은 로직을 사용하였다.
transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
ScreenToWorldPoint() 함수는 스크린 좌표계의 좌표값을 월드 좌표계로 변환할 때 사용하는 함수이다. 그러면, 마우스의 좌표는 왜 이 함수를 사용해야 하는 걸까?
아래는 내가 만든 게임의 유니티 에디터 화면이다.
위를 살펴보면, 왼쪽이 월드 좌표계이고 오른쪽이 스크린 좌표계이다.
월드 좌표계
우리가 수학 시간에 많이 사용하던 좌표계로 가운데 (0,0)을 뜻하는 원점이 있다. x 값과 y 값은 원점을 기준으로 양 혹은 음의 실수를 가진다. 현재 보이지 않지만 오른쪽에 파란 원이 위치한 곳이 바로 월드 좌표계의 원점이다.
스크린 좌표계
하단 맨 왼쪽을 (0,0)으로 시작하여 해상도에 따라 x와 y의 최대값이 달라진다. 현재 내가 설정한 해상도는 760 x 1280이기 때문에 x로는 최대 760, y로는 최대 1280까지 존재한다. 스크린 좌표계의 경우, 저 파란 원의 좌표는 (380, 640)인데, 이는 화면 정중앙에 있기 때문에 최댓값을 2로 나눈 값이다.
이와 같이, 같은 오브젝트라도 스크린 좌표계와 월드 좌표계의 값이 차이가 나는 것을 볼 수 있다. 마우스의 경우, 우리는 월드 좌표계에서가 아닌 게임을 실행한 후의 스크린 좌표계에서 사용하기 때문에 우리가 값을 가져와서 적용하기 위해서는 마우스의 월드 좌표계의 값이 필요하다. 따라서, 위와 같이 메인 카메라의 스크린에서 마우스의 좌표를 가져와 이를 월드 좌표계 값으로 변경한 것이다.