사전캠프/Unity

Unity 기능 : ScreenToWorldPoint

서보훈 2024. 8. 22. 15:19

2주차, 3주차 강의중,  카메라에 클래스에 포함된 ScreenToWorldPoint 함수를 사용해서 오브젝트를 마우스 위치에 맞게 움직이는것을 구현하였습니다.

 

이 함수는 어떻게 마우스의 위치를 게임상의 위치좌표로 변환하는지 정리해보도록 하겠습니다.


해당 함수의 유니티 메뉴얼입니다.

https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

 

Unity - Scripting API: Camera.ScreenToWorldPoint

World space coordinates can still be calculated even when provided as an off-screen coordinate, for example for instantiating an off-screen object near a specific corner of the screen. Screenspace is defined in pixels. The bottom-left of the screen is (0,0

docs.unity3d.com


 

일단 마우스의 좌표에 대해 설명하겠습니다.

마우스의 좌표는 화면의 왼쪽 아래를 (0, 0) 으로 기준삼아 Vector2 로 저장되게 됩니다.

 

간단하게 마우스를 따라다니는 원형 스프라이트와, 마우스의 좌표를 정수형으로 표기하도록 만들었습니다.

해당 영상을 보시면 마우스의 좌표가 왼쪽아래에 가까울수록 (0, 0) 에 가깝고 오른쪽 위에 가까울수록 이 화면의 크기인 760 X 1280 인 (760, 1280) 에 가까워지는것을 볼 수 있습니다.

 

 

 

카메라의 위치를 (5,0,0) 으로 만들고, 포인터가 현재 자신의 게임상 위치를 표기하도록 만들었습니다.

카메라 중앙에 포인터가 위치하면 (5, 0) 위치에 포인터가 있는것을 볼 수 있습니다.

 

이 기능을 사용하기 전에, 어떤 카메라를 사용할것인지 선언하고 마우스의 인풋값을 함수에 매개변수로 사용하게 됩니다.

여기서 카메라를 선언하는 이유는, 그 카메라를 기준으로 위치를 잡아주기 위함입니다.

 

만들어준 코드에서 마우스를 따라다니는 오브젝트의 z축을 추가하여 표기하면 다음과 같이 표기됩니다

private Vector3 mousePos;
public GameObject pointer;

public TextMeshProUGUI positionText;

private void Update()
{
    mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    pointer.transform.position = new Vector3(mousePos.x, mousePos.y, mousePos.z);

    positionText.text = $"( {(int)mousePos.x}, {(int)mousePos.y}, {(int)mousePos.z})";
}

Z축이 메인카메라와 동일한것을 볼 수 있습니다.

 

즉 해당 기능은 마우스 포인터의 좌표를 지정한 카메라의 position 값을 기준으로, 값을 수정하여 Vector3 값으로 변환하는것을 알 수 있습니다.

 

만약 2D 형태의 게임이라면 Z축의 값을 개발자가 임의로 지정하여 사용하는 방식을 사용할 수 있지만, 3D 게임에서는 해당 방법을 사용하기 어렵습니다.

 

그럴때 사용하기 위해 Camera 클래스의 함수중, ScreenPointToRay() 함수를 사용하게 됩니다.

이 함수를 말로 설명하면, 입력한 위치의 카메라의 시작점에서 카메라의 시야 끝으로 광선을 쏴서, 처음 오브젝트에 맞는 위치를 반환해주는것입니다.

 

해당 함수는 RaycastHit 을 응용하여 사용하는 방식이기 때문에, 차후에 따로 정리하도록 하겠습니다.