🙇‍♀️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는 더 다양한 정보를 담고 있음

태그:

카테고리:

업데이트: