ABOUT ME

Today
Yesterday
Total
  • Raycasting(레이캐스팅) with 유닛 클릭
    유니티 2022. 2. 4. 13:24

    1. 스타크래프트 유닛클릭

    스타크래프트를 하면 마우스로 유닛을 클릭하는 기능이 있다. 이러한 것을 구현하기 위해 레이캐스팅이란 기능이 아주 유용하다.

    레이캐스팅은 레이저를 쏜다는 느낌으로 볼 수 있다.

    마우스로 게임속에 있는 물체를 누르면 우리가 보고 있는 카메라로부터 레이저를 쏴서 그 (X, Y) 좌표에 해당하는 유닛과 충돌한다면 레이캐스팅과 충돌한 유닛의 정보를 추출하는 식으로 구현하면 될 것이다.

     

    2. 유닛클릭 구현

    일반 구현

            if(Input.GetMouseButtonDown(0)) // 마우스 좌클릭을 하면
            {
                // 마우스 위치 정보 (1)
                Vector3 mousePos =
                    Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
                
                // 카메라가 보고 있는 방향의 정보 (2)
                Vector3 dir = mousePos - Camera.main.transform.position;
                dir = dir.normalized;
    
                // 카메라가 보는 방향으로 마우스를 통해 레이캐스팅 그리기( (1)과 (2)의 조합 )
                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.collider.gameObject.name}");
                }

    위에는 원리의 이해를 위해 자세하게 구현되어있다.

     

     

    Ray를 통한 간단한 구현

            if (Input.GetMouseButtonDown(0)) // 마우스 좌클릭 시 if문 진입
            {
                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}");
                }
            }

     

    레이캐스팅은 성능에 부담이 되므로 신중히 써야한다.

    '유니티' 카테고리의 다른 글

    카메라(Camera)  (0) 2022.02.04
    레이어(Layer)  (0) 2022.02.04
    Collision과 Trigger  (0) 2022.02.03
    RigidBody와 Collider  (0) 2022.02.03
    Resource Manager  (0) 2022.02.03
Designed by Tistory.