-
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