화면 좌표계는 게임 화면에서 실제로 보이는 좌표 시스템을 의미한다. 이 좌표는 2D로 표현되고, 게임 화면에서 마우스나 객체가 위치한 좌표를 나타낼 때 사용된다. 주로 픽셀 단위로 좌표를 다룬다.
(0, 0)은 화면의 왼쪽 하단이고, (1280, 900)은 화면의 오른쪽 상단이 된다.(0, 0)은 화면의 왼쪽 하단, (1, 1)은 화면의 오른쪽 상단을 나타낸다.Screen 좌표와 Viewport 좌표로 출력하기void Update()
{
// 마우스 위치 출력 (Screen 좌표)
Debug.Log(Input.mousePosition);
// 마우스 위치를 Screen 좌표에서 Viewport 좌표로 변환 후 출력
Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition));
}
(0, 0) ~ (Screen.width, Screen.height) 범위의 픽셀 좌표로 나타낸다.Screen 좌표계로 나타낸 마우스 위치를 (0, 0) ~ (1, 1) 범위의 비율 좌표로 변환해준다.게임 화면에서 특정 오브젝트를 마우스로 클릭하면 그 위치를 월드 좌표계로 변환해야 한다. 이를 통해 클릭한 지점에서 오브젝트나 캐릭터가 반응할 수 있게 된다. 이 과정을 단계별로 살펴보자.
마우스 커서의 위치는 화면 좌표계(Screen)로 주어지는데, 이를 월드 좌표계(World)로 변환하는 과정이 필요하다.
Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
마우스 클릭으로 얻은 월드 좌표를 바탕으로, 카메라가 그 지점으로 향하는 방향 벡터를 계산한다.
Vector3 dir = mousePos - Camera.main.transform.position;
dir = dir.normalized;
이제, 계산된 방향을 따라 Raycast를 쏘아서 마우스로 클릭한 위치에 있는 오브젝트와 충돌하는지 확인한다.
Debug.DrawRay(Camera.main.transform.position, dir * 100.0f, Color.red, 1.0f); // 1초 동안 광선을 그림
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, dir, out hit, 100.0f))
{
Debug.Log(hit.collider.gameObject.name); // 충돌된 오브젝트의 이름 출력
}
Camera.main.transform.position에서 dir * 100.0f까지 광선을 시각적으로 그려볼 수 있다.hit 변수에 담는다.hit.collider를 통해 충돌한 오브젝트의 GameObject 정보를 가져올 수 있다.또 다른 방법으로, 마우스 위치를 화면 좌표에서 바로 Ray로 변환하는 방법도 있다.
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 화면 좌표를 Ray로 변환
Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f); // 광선 시각화
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f))
{
Debug.Log(hit.collider.gameObject.name); // 충돌된 오브젝트의 이름 출력
}
}
게임에서 카메라는 3D 월드 공간을 2D 화면 공간에 투영하여 보여준다. 이를 통해 실제 3D 공간에서 일어나는 일이 화면에 나타날 수 있다.
이 두 값은 카메라가 렌더링하는 시야의 범위를 결정한다. 예를 들어, nearClipPlane이 너무 큰 값으로 설정되면, 카메라는 너무 가까운 물체를 렌더링하지 않게 된다.