우리가 화면을 통해 보는 유니티 3D 환경은 x, y, z 축으로 이루어진 3 차원 벡터 공간이다. 하지만 우리는 2차원인 모니터를 통해 그 3 차원 공간을 보기 때문에 마우스를 통해 좌표를 얻을때 원하는 대로 코드가 진행되지 않는다.
가장 처음 맞는 문제점은 x, y 축은 받을 수 있지만 z 축은 알 수가 없다.
또 다른 문제점은 x, y 축을 안다고 해도 실제 Unity 3D 에서 사용되는 World 좌표와 다르기 때문에 엉뚱한 곳에 좌표가 잡히게 된다.
우선 마우스의 좌표값을 로그로 찍어보면 어떤 값이 나오는지 확인해 보자.
[-3.05, 14.55, 0.00]
마우스 위치가 빨간 화면에 왼쪽 밑에 두고 로그를 찍었을때에 값이다.
[959.44, 537.76, 0.00]
Game 에디터에 화면을 1920 x 1080 으로 맞춘 상태에서 마우스를 중앙 근처에서 찍었을 때에 위치 값이다. 화면 해상도에 절반에 근사값으로 표시 되었다.
그럼 이제 마우스 위치 값에 Sphere를 생성해 보겠다.
화면 중앙을 클릭 했지만 오브젝트에 생성 위치는 전혀 이상한 곳에서 스폰이 되었다.
screen 좌표에서 사용되는 좌표를 그대로 world 좌표로 불러와서 사용하면 이러한 문제가 생긴다는 것을 알 수 있다.
이제 screen 좌표를 world 좌표로 변경을 하겠다.
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray,out hit))
{
Instantiate(prefeb, hit.point, Quaternion.identity);
}
}
코드를 보면 유니티에서 간편하게 좌표 변환을 해 주는 기능을 살펴볼 수 있다.
Ray 구조체를 먼저 보겠다.
Ray를 선언 후 ScreenPointToRay 함수에 마우스 좌표를 인자값으로 전달해 주고 그 리턴값을 ray 에 담아 준다.
ScreenPointToRay 가 뭔지 살펴보자
카메라에서 스크린 포인트를 통과하는 광선을 반환한다고 요약 되어 있다.
매개 변수를 살펴 보면 더 이해가 잘 간다. 매개 변수는 마우스 포지션을 받는다. 마우스 포지션의 좌표는 위에 설명 했듯이 스크린 사이즈의 평면 좌표를 그대로 받아온다.
ScreenPointToRay는 마우스 포지션 값을 기점으로 쏜 레이에 정보를 리턴한다고 이해하면 될 것 같다.
RaycastHit 구조체 역시 유니티에서 제공하는 기능이다.
충돌된 값에 정보(거리, 위치, rigidbody, transform.. etc) 를 리턴받는 함수들이 내장되어 있다.
Pysics 클래스에 Raycast 함수는 boolean 형으로 ray에 물체가 맞았는지를 판별한다.
Instantiate 함수를 사용해서 오브젝트를 생성하였다.
인자값으로는 (생성할 오브젝트, hit.point, Quaternion.identity) 가 있다.
hit.point 는 위치값을 갖고 있는 Vector3 데이터 타입이다.
Quaternion.identity 는 생성할 오브젝트에 회전값을 설정하는 값인데 이에 대해서는 나중에 따로 포스팅을 하겠다.
이제 실행 버튼을 누르면
마우스가 위치한 포지션 값에 오브젝트가 잘 생성된 것을 알 수 있다
'Unity' 카테고리의 다른 글
GetAxis 와 GetAxisRaw의 차이점 (1) | 2023.10.23 |
---|---|
[Unity3D] 월드 좌표계와 스크린 좌표계 이해하기 -(2) (0) | 2022.12.24 |
[Unity] - Start() 함수와 Update() 함수 (0) | 2021.08.31 |
[Unity] Animator - Has Exit Time (0) | 2021.08.28 |
[Unity] Time.deltaTime 사용법 (0) | 2021.08.28 |