유니티에서 2D나 3D에서 마우스 클릭으로 해당 오브젝트 정보 읽어오는 부분은
레이캐스트를 이용해 구현을 하였다.
하지만, 인벤토리를 만들어 보려고 캔버스 위에서 슬롯과 아이콘오브젝트를
레이캐스트를 이용해 움직이려 했으나 반응하질 않았다.
늘 그랬듯이 인터넷을 뒤적인 결과,
캔버스에서 작업할 땐 레이캐스트가 아닌 그래픽 레이캐스트라는 것을 사용한다는 정보를 얻었다.
그래픽스 레이캐스터는 캔버스에 레이캐스트를 하는 데 사용합니다.
레이캐스터는 캔버스의 모든 그래픽스를 감시하여 그 중 하나에 충돌하였는지 여부를 결정합니다.
그래픽 레이캐스터를 설정하여 후면 그래픽스를 무시하거나 그 앞에 있는 2D 또는 3D 오브젝트에 의해 가려지도록 설정할 수 있습니다. 이 요소의 처리 순서를 레이캐스팅의 앞이나 뒤로 변경하고 싶은 경우, 수동으로 우선 순위를 지정할 수도 있습니다.
캔버스에서 레이캐스트 관련 작업을 하려면 이 친구를 사용해야 한다.
using UnityEngine.UI; // 캔버스
using UnityEngine.EventSystems; //포인터 관련 데이터를 얻기 위한 PointerEventData 사용하기 위함
//Canvas에서 레이캐스트 쓰기
private GraphicRaycaster gr;
private PointerEventData ped;
private List<RaycastResult> rrList;
List< RaycastResult > 레이캐스트 결과값들을 저장하는 RaycastResult형의 리스트이다.
TryGetComponent(out gr);
if (gr == null)
gr = gameObject.AddComponent<GraphicRaycaster>();
ped = new PointerEventData(EventSystem.current);
rrList = new List<RaycastResult>(5);
public T RaycastFirstComponent<T>() where T : Component
{
//리스트 clear해준 후
rrList.Clear();
//rrList에 레이캐스트 결과가 저장됨.
gr.Raycast(ped, rrList);
//만약 레이가 닿은 물체가 없다면
if (rrList.Count == 0)
return null;
//있으면 첫 번째로 닿은 거 가져왕
return rrList[0].gameObject.GetComponent<T>();
}
레이캐스트 닿은것중에 제일 위의 오브젝트의 컴퍼넌트를 가져오는 RaycastFirstComponent함수이다.
제네릭을 사용해 범용성을 높였다.