뷰 절두체의 이해 섹션에서는 카메라의 뷰에서 모든 점은 월드 공간의 하나의 선에 대응된다고 설명했습니다. 때로는 그 선의 수학적인 표현을 사용하는 것이 편리한 경우가 있으며 Unity는 이것을 레이(Ray) 오브젝트로 제공할 수 있습니다. 레이는 항상 뷰 내의 한 점에 부합하므로 Camera 클래스는 ScreenPointToRay 및 ViewportPointToRay 함수를 제공합니다. 이 둘의 차이는 ScreenPointToRay가 점을 픽셀 좌표를 필요로 하는 반면 ViewportPointToRay는 0..1(뷰에서 0이 왼쪽 또는 아래쪽 1이 오른쪽 또는 위쪽) 범위의 정규화된 좌표를 요구한다는 점입니다. 이 각각의 함수는 원점과 원점으로부터 나가는 선의 방향을 나타내는 벡터로 구성된 레이의 값을 반환합니다. 레이는 카메라의 transform.position 포인트 대신 근접 클리핑 평면을 기점으로 하고 있습니다.
카메라를 통한 레이의 가장 일반적인 사용 방법은 씬에 raycast를 실행하는 것입니다. 레이캐스트는 가상의 “레이저 빔”을 원점에서부터 레이에 따라 씬 안의 콜라이더에 충돌할 때까지 보냅니다. 그 다음 오브젝트와 RaycastHit 오브젝트의 충돌된 점에 대한 정보를 반환합니다. 이것은 스크린상 나타난 이미지를 기반하여 오브젝트가 어디에 위치하는지 찾는 유용한 방법입니다. 예를 들어, 마우스 포지션에 있는 오브젝트는 다음 코드로 확인할 수 있습니다.
C# 스크립트 예제:
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public Camera camera;
void Start(){
RaycastHit hit;
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
Transform objectHit = hit.transform;
// Do something with the object that was hit by the raycast.
}
}
}
JS 스트립트 예제:
var hit: RaycastHit;
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, hit)) {
var objectHit: Transform = hit.transform;
// Do something with the object that was hit by the raycast.
}
때로는 화면의 한 포지션에 반응하는 레이를 설정하고 카메라를 레이에 따라 이동시키는 것이 유용할 때가 있습니다. 예를 들어, 사용자가 오브젝트를 마우스로 선택하여 동일한 화면 위치를 “고정”하면서 줌인할 경우가 있습니다(이것은 카메라가 전술 지도를 볼 때 유용할 수 있습니다). 이 작업을 위한 코드는 매우 간단합니다.
C# 스크립트 예제:
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public bool zooming;
public float zoomSpeed;
public Camera camera;
void Update() {
if (zooming) {
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
float zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}
}
}
JS 스트립트 예제:
var zooming: boolean;
var zoomSpeed: float;
if (zooming) {
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}