Quick Reference
장식 Graphic의 Raycast Target은 끄고 입력 대상만 켜며, 클릭 불가는 투명 Graphic·CanvasGroup·EventSystem·Input Module부터 확인합니다.
- 기준 버전은 Unity 6.5 (6000.5), Unity UI (UGUI) 2.0.0입니다.
GraphicRaycaster는 Canvas 안에서 포인터가 닿은Graphic을 찾고, EventSystem과 UI Input Module이 그 결과를 버튼·드래그 이벤트로 전달합니다. - 장식 Image, 배경, 읽기 전용 텍스트는 Raycast Target을 끕니다. 버튼의 실제 target graphic, 입력 필드, 팝업 뒤를 막는 dim은 켜 둡니다.
- 클릭이 안 되면 버튼부터 다시 만들기보다 위를 덮은 투명
Graphic,CanvasGroup.blocksRaycasts, EventSystem과 Input Module을 먼저 확인합니다.
Inspector 설정
Canvas의 Graphic Raycaster
- Ignore Reversed Graphics의 기본은 켜짐입니다. raycaster를 등지고 있는 Graphic을 입력 후보에서 제외합니다. 일반적인 화면 UI와 한쪽 면만 사용하는 World Space UI에서는 유지하고, 뒤집힌 양면 UI도 입력을 받아야 할 특별한 경우에만 끕니다.
- Inspector의 Blocked Objects(
blockingObjects) 기본은None입니다.None,Two D,Three D,All중에서 골라 Graphic raycast 앞의 물리 객체가 UI를 가리게 할 수 있습니다. Screen Space - Overlay의 일반 HUD에는 보통None이 맞습니다. World Space UI가 벽 뒤에 있을 때만 필요한 2D/3D 차단을 켭니다. - Blocking Mask는 Blocked Objects 검사에 포함할 Physics layer이며 기본은 모든 layer입니다.
All을 그대로 쓰면 UI 입력마다 불필요한 layer까지 확인할 수 있습니다. UI를 실제로 막아야 하는 벽·지형 layer만 남깁니다.
Graphic의 Raycast Target
Image,RawImage,Text, TextMeshPro UGUI 같은 Graphic에는 Raycast Target이 있습니다. 켜면 해당 도형이 UI 입력 후보가 됩니다. 투명도 0인 Image도 target이 켜져 있으면 입력을 막을 수 있습니다.Button은 보통 Button의Target Graphic으로 지정된 Image가 raycast를 받아야 클릭됩니다. 버튼의 글자만 target이고 배경 Image를 꺼 버리면 클릭 면적이 의도보다 작아질 수 있습니다.- 팝업 dim은 클릭을 뒤 UI로 통과시키지 않으려면 target을 켭니다. 반대로 시각 효과일 뿐인 전체 화면 Image는 꺼야 합니다.
// 장식 Graphic은 인스펙터에서 끄거나 코드에서 명시적으로 제외합니다.
decoration.raycastTarget = false;Popup
Dim Image Raycast Target: ON <- 뒤 클릭 차단
Panel Image Raycast Target: OFF <- 패널 자체가 입력 대상이 아니면 해제
Confirm Button Target Graphic: ON <- 버튼 입력 면스크립트 연결
일반 버튼 처리에는 IPointerClickHandler, Button의 onClick, Event Trigger를 사용하고 GraphicRaycaster.Raycast를 매 프레임 직접 호출하지 않습니다. 직접 raycast는 화면 좌표에서 최상단 UI를 조사하거나, 게임 입력을 UI가 가로챘는지 판별할 때 사용합니다.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public sealed class UiHitProbe : MonoBehaviour
{
[SerializeField] private GraphicRaycaster raycaster;
private readonly List<RaycastResult> results = new();
private PointerEventData pointerData;
private void Awake()
{
pointerData = new PointerEventData(EventSystem.current);
}
public GameObject GetTopHit(Vector2 screenPosition)
{
pointerData.position = screenPosition;
results.Clear();
raycaster.Raycast(pointerData, results);
return results.Count > 0 ? results[0].gameObject : null;
}
}Raycast(PointerEventData, List<RaycastResult>)는 두 번째 인자로 넘긴 목록에 입력 후보를 채웁니다. 목록을 재사용하면 반복 조사에서 불필요한 할당을 줄일 수 있습니다.PointerEventData.position은 화면 좌표입니다. World Space Canvas라도 마우스·터치 위치는 화면 좌표로 넣고, Canvas의 event camera가 광선을 만듭니다.EventSystem.current가 없으면 UI 이벤트 자체가 동작하지 않습니다. 새 Input System을 쓴다면 EventSystem에InputSystemUIInputModule, 구 Input Manager를 쓴다면StandaloneInputModule처럼 프로젝트 입력 방식에 맞는 module 하나가 있어야 합니다.
자주 틀리는 부분
보이지 않는 full-screen Image가 가장 흔한 클릭 blocker입니다. 색 alpha를 0으로 내려도 Raycast Target은 자동으로 꺼지지 않습니다. blocker가 목적이 아니라면 target을 끄고, blocker라면 이름을 DimBlocker처럼 역할이 드러나게 둡니다.
Blocking Objects = All은 기본 최적화 설정이 아닙니다. World Space UI가 3D 물체 뒤에 있을 때만 필요한 물리 차단을 켜고, Blocking Mask도 관련 layer로 제한하세요. 일반 HUD에서 켜면 입력 경로만 불필요하게 복잡해집니다.
참고 링크
2 sources