C# Rookiss Part3 유니티 엔진 : Raycast
🙇♀️Raycast
레이케스팅은 기본적으로는 처음으로 맞은 물체만 인식
🪐Raycast
Debug.DrawRay(transform.position, Vector3.forward * 10, Color.red);
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.forward, out hit, 10))
Debug.Log($"Raycast hit!{hit.collider.gameObject.name}");
- 월드좌표에서 나가므로 Z축 방향으로만 나감
Vector3 look = transform.TransformDirection(Vector3.forward);
Debug.DrawRay(transform.position, look * 10, Color.red);
RaycastHit hit;
if (Physics.Raycast(transform.position, look, out hit, 10))
Debug.Log($"Raycast hit!{hit.collider.gameObject.name}");
- 로컬 좌표로 바꿈
Vector3 look = transform.TransformDirection(Vector3.forward);
- 사용
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)
{
Debug.Log($"RacastHit! {hit.transform.gameObject.name}");
}
- 레이에 맞는 모든 오브젝트를 알고싶을 때
- RaycastAll 사용
🪐mousePosition
Local <-> World <-> (Viewport <-> Screen) (화면)
Debug.Log(Input.mousePosition); // Screen
- 화면에 픽셀단위로 위치를 알려줌
Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); // Viewport
- 화면 비율로 위치를 알려줌
- 최대 (1, 1, 0)
Click!
if (Input.GetMouseButtonDown(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; // 방향벡터의 크기를 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($"Raycast Camera @ {hit.transform.gameObject.name}");
}
}
더 간단한 방법으로는 Ray를 사용하는 것!
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); // ray.direction이 카메라와 마우스의 단위방향벡터
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f))
{
Debug.Log($"Raycast Camera @ {hit.transform.gameObject.name}");
}
}
Ray는 더 다양한 정보를 담고 있음