게임을 구현하다 보면 플레이어를 카메라 안에 가둬야 할 때가 있다.
예를 들어서 이동하는 플레이어를 따라다니지 않는 카메라인 경우 카메라는 고정되어있으니 플레이어가 계속 움직인다면 언젠가는 플레이어가 카메라 밖으로 나갈 것이다.
따라서 월드좌표계를 뷰포트 좌표계로 변환하여 플레이어를 카메라 안으로 가둘 때 사용할 수 있는 코드를 첨부한다.
Vector3 pos = Camera.main.WorldToViewportPoint(transform.position);
if (pos.x < 0f) pos.x = 0f;
if (pos.x > 1f) pos.x = 1f;
if (pos.y < 0f) pos.y = 0f;
if (pos.y > 1f) pos.y = 1f;
transform.position = Camera.main.ViewportToWorldPoint(pos);
WorldToViewportPoint함수는 position을 월드 좌표에서 뷰포트 좌표로 변환하는 함수이다.
대부분의 오브젝트들은 월드좌표를 따른다. 그리고 뷰포트 좌표는 게임 실행 시 보이는 카메라의 좌표로 왼쪽 하단을 (0,0) 오른쪽 상단을 (1,1)로 설정한다.
위와 같이 함수를 사용하고 매개변수로 바꾸고싶은 객체의 월드좌표를 Vector3변수에 저장한다. 왜냐하면 월드좌표계는 Vector3값으로 이루어져있기 때문이다.
이제 pos라는 변수에 월드좌표가 뷰포트좌표로 변환되었으니 조건문을 써 주고 ViewportToWorldPoint함수를 사용하여 바꾸고자 했던 오브젝트에 좌표를 대입시켜준다. 그러면 뷰포트 좌표로 계산된 식이 월드좌표로 변환되어 오브젝트의 좌표로 설정된다.
여기까지가 내가 이해한 방식이고 아래 링크는 유니티에서 제공하는 설명이다.
https://docs.unity3d.com/kr/530/ScriptReference/Camera.WorldToViewportPoint.html
Unity - 스크립팅 API: Camera.WorldToViewportPoint
Viewport space is normalized and relative to the camera. The bottom-left of the camera is (0,0); the top-right is (1,1). The z position is in world units from the camera.
docs.unity3d.com
'Develop > Unity' 카테고리의 다른 글
[Unity] 오브젝트 풀링 (0) | 2023.11.22 |
---|---|
[Unity] 유니티 멀티플레이를 위한 통신 구현 (Unity Mirror) (2) | 2023.11.21 |
[Unity] 씬 로딩 시 start함수의 동작 (0) | 2022.01.12 |
[Unity] 유니티 FadeIn, FadeOut (코루틴 사용법) (0) | 2022.01.06 |
Prologue (0) | 2022.01.04 |