광선을 쏘아 충돌하는 오브젝트가 있는지 검사하는 것.
EX)
void Update()
{
Debug.DrawRay(transform.position + Vector3.up, Vector3.forward * 10, Color.red);
RaycastHit hit;
if(Physics.Raycast(transform.position + Vector3.up, Vector3.forward, out hit, 10))
{
Debug.Log($"Raycast{hit.collider.gameObject.name}");
}
}
플레이어의 앞으로 Raycast를 쏘아 레이저와 만나는 오브젝트의 이름을 가져오는 코드
Physics.Raycast(transform.position + Vector3.up, Vector3.forward, out hit, 10)
transform.position + Vector3.up 위치에서 광선 발사
월드 좌표를 기준으로 정면으로 Ray를 발사한다.
Ray에 닿은 오브젝트의 정보가 hit에 담긴다.
RaycastHit hit;
광선의 길이를 10으로 설정한다.
void Update()
{
Vector3 look = transform.TransformDirection(Vector3.forward);
Debug.DrawRay(transform.position + Vector3.up, look * 10, Color.red);
RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position + Vector3.up, look, 10);
foreach(RaycastHit hit in hits) // 광선이 관통하여 닿은 모든 오브젝트들이 hits배열에 담긴다.
{
Debug.Log($"Raycast{hit.collider.gameObject.name}");
}
}
이 상태에서 정면에 하나의 오브젝트가 아닌 여러가지의 오브젝트가 있고 그 충돌한 모든 오브젝트를 알고 싶다면 RaycastAll을 사용해야한다.
Vector3 look = transform.TransformDirection(Vector3.forward);
RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position + Vector3.up, look, 10);
Local
World
화면 좌표계 -> 카메라 오브젝트가 촬영해서 보여주는 게임(Game)화면 상의 좌표. 2D좌표이다.
Screen(픽셀 좌표를 기준)
Viewport(픽셀을 비율로)
void Update()
{
Debug.Log(Input.mousePosition); // 현재 마우스 좌표를 픽셀 좌표(스크린 좌표)로 뽑아온다.
Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition));
}



near
far
if(Input.GetMouseButton(0)) // 게임 화면에 마우스 좌클릭
{
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;
Debug.DrawRay(Camera.main.transform.position, dir * 100.0f, Color.red, 1.0f); // 1 초동안 Camera.main.transform.position 위치로부터 dir * 100.0f 만큼을 더한 위치까지의 광선을 그림
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, dir, out hit, 100.0f))
{
Debug.Log(hit.collider.gameObject.name);
}
}
Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
중요 (Z축 처리)
마우스 클릭한 좌표 (Input.mousePosition)
screenPosition.z = Camera.main.nearClipPlane 를 넣는 이유
결과적으로 변환된 mousePos의 Z값은?
mousePos.z = Camera.main.transform.position.z + Camera.main.nearClipPlane
<다른 분 블로그에서 퍼온 설명>

예를 들어 게임 화면 상에서 화면상 픽셀 좌표 기준으로 (160, 180)에 해당하는 픽셀에 마우스 클릭을 했다고 가정해보자. 이 좌표는 Vector3 로 보면 (160, 180, 0) 상태일 것이다. 화면상 좌표는 z 값 없이 2D 니까.. 클릭했던 이 (160, 180) 픽셀 좌표를 게임 월드 기준으로 변환하고자 ScreenToWorldPoint(Vector3(160, 180, 3)) 로 실행시켰다고 가정해보자. z값으로 넘긴 3 을 카메라와의 ‘거리’를 3 이라고 고려하여 화면상 좌표인 (160, 180)를 월드 기준 좌표로 변환했더니 (3.7, 4.8, -0.6)이 되었다. 현재 카메라 위치의 z 값 + 3 👉 - 0.6.
그리고 인수로 넘겨준 z 값, 즉 고려할 카메라와의 거리를 렌더링 시작 위치까지의 거리인 Camera.main.nearClipPlane로 넘겨준 이유는! 카메라 현재 위치로부터, 위에서 변환했던 클릭한 마우스 위치의 World 좌표로 향하는 방향을 구해서 그 방향으로 Raycast를 쏠 것이기 때문에 어차피 방향이 중요하지 z 값은 크게 중요하지 않아서 렌더링 시작 거리인 Camera.main.nearClipPlane로 선택하신 듯 하다
Vector3 dir = mousePos - Camera.main.transform.position; // 마우스 위치 - 카메라 위치
dir = dir.normalized; // 정규화 (길이를 1로 만듦)
카메라에서 마우스 클릭한 곳을 향하는 방향 벡터Debug.DrawRay(Camera.main.transform.position, dir * 100.0f, Color.red, 1.0f);
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, dir, out hit, 100.0f))
{
Debug.Log(hit.collider.gameObject.name);
}
if(Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
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($"Raycast Camera @ {hit.collider.gameObject.name}");
}
}
💡 즉, “마우스 클릭한 위치에서 카메라를 기준으로 한 광선(Ray)을 자동으로 생성!”
💡 ray.origin → 카메라 위치
💡 ray.direction → 마우스를 향하는 방향 벡터
🔍 ScreenPointToRay()는 내부적으로 어떻게 동작할까?
