본문 바로가기

메모장/Unity

[Unity] GraphicRaycaster (UGUI 레이캐스팅 하기)

유니티의 UGUI는 Canvas의 Render Mode가 'Screen Space - Overlay' 일 경우 카메라를 사용하지 않고 렌더링 과정에서 그려진 오브젝트들 위에 덧그려진다.

이때 UI에 Raycast를 사용하려면 어떻게 해야 할 까?

UGUI 오브젝트를 생성하면 자동으로 Canvas가 생성된다. 이때 Canvas를 살펴보면 Graphic Raycaster가 달려있는것을 볼 수 있다.

링크 : https://docs.unity3d.com/kr/530/Manual/Raycasters.html

유니티 메뉴얼에 따르면 Graphic Raycaster는 캔버스 안을 검색하는 Raycaster이며, EventSystem이 이벤트를 검출하는 수단으로 사용된다는 것을 알 수 있다.

 

하지만 메뉴얼에는 Graphic Raycaster를 어떻게 써야하는지 스크립트 예시가 적혀있지 않다. 그래서 예시를 만들어 두려고 한다.

// UGUI Canvas의 Render Mode가 'Screen Space - Overlay' 일 경우
// GraphicRaycaster 컴포넌트를 통해 마우스 이벤트를 받는 예시
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class GraphicRaycasterEx : MonoBehaviour
{
    // 예시에서 사용할 GraphicRaycaster객체
    private GraphicRaycaster gr;

    private void Awake()
    {
        gr = GetComponent<GraphicRaycaster>();
    }

    private void Update()
    {
        var ped = new PointerEventData(null);
        ped.position = Input.mousePosition;
        List<RaycastResult> results = new List<RaycastResult>();
        gr.Raycast(ped, results);

        if (results.Count <= 0) return;
        // 이벤트 처리부분
        results[0].gameObject.transform.position = ped.position;
    }
}

GraphicRaycaster는 UnityEngine.UI 에 PointerEventData는 UnityEngine.EventSystems에 있다.

 

가장 위쪽에 노출되어 있는 UGUI오브젝트부터 순서대로 results에 저장된다.
results[0]는 가장 위쪽에 있는 UGUI 오브젝트 이다.