[Unity]그래픽레이캐스트 - 캔버스에서 레이캐스트 작업할 때

jh Seo·2022년 9월 20일
0

유니티

목록 보기
18/50

개요

유니티에서 2D나 3D에서 마우스 클릭으로 해당 오브젝트 정보 읽어오는 부분은
레이캐스트를 이용해 구현을 하였다.

하지만, 인벤토리를 만들어 보려고 캔버스 위에서 슬롯과 아이콘오브젝트를
레이캐스트를 이용해 움직이려 했으나 반응하질 않았다.

늘 그랬듯이 인터넷을 뒤적인 결과,
캔버스에서 작업할 땐 레이캐스트가 아닌 그래픽 레이캐스트라는 것을 사용한다는 정보를 얻었다.

그래픽 레이캐스트(GraphicRaycaster)

그래픽스 레이캐스터는 캔버스에 레이캐스트를 하는 데 사용합니다.
레이캐스터는 캔버스의 모든 그래픽스를 감시하여 그 중 하나에 충돌하였는지 여부를 결정합니다.

그래픽 레이캐스터를 설정하여 후면 그래픽스를 무시하거나 그 앞에 있는 2D 또는 3D 오브젝트에 의해 가려지도록 설정할 수 있습니다. 이 요소의 처리 순서를 레이캐스팅의 앞이나 뒤로 변경하고 싶은 경우, 수동으로 우선 순위를 지정할 수도 있습니다.

캔버스에서 레이캐스트 관련 작업을 하려면 이 친구를 사용해야 한다.

예시

  • pointerEventData와 UI를 선언
using UnityEngine.UI;   // 캔버스 
using UnityEngine.EventSystems;    //포인터 관련 데이터를 얻기 위한 PointerEventData 사용하기 위함
  • GraphicRaycaster, PointerEventData, List< RaycastResult >를 선언해준다.
    //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함수이다.
제네릭을 사용해 범용성을 높였다.

profile
코딩 창고!

0개의 댓글