Deff_Dev

[Unity/C#] 이벤트 호출 안될 때 본문

Unity(유니티)/유니티 공부

[Unity/C#] 이벤트 호출 안될 때

Deff_a 2024. 7. 4. 00:22
 

지원되는 이벤트 - Unity 매뉴얼

이벤트 시스템은 다수의 이벤트를 지원하며 사용자가 작성한 입력 모듈을 통해 한층 더 효율적으로 커스터마이징할 수 있습니다.

docs.unity3d.com

 

유니티에서는 다양한 이벤트를 지원하는데, 게임 오브젝트에 클릭(터치) 이벤트를 적용시킬 때, 이벤트 함수 호출안되는 경우가 있다.

 

using UnityEngine;
using UnityEngine.EventSystems;

public class UnitTile : MonoBehaviour, IDragHandler, IPointerClickHandler, IEndDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log($"타일 드래그중...");
    }

    public void OnPointerClick(PointerEventData eventData)
    {
    	Debug.Log($"타일 터치 ");
    }
    
    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log($"타일 터치 해체 ");
    }
}

 

이때 두 가지를 확인해보면 된다.

1. Hierarchy에 EventSystem이 존재하는지 확인하고, 없다면 우클릭 후 UI 탭에서 생성한다.

 

2. 게임 오브젝트에 이벤트 함수를 호출 할 때,

  • 3D ▶ MainCamera에 Physics RayCaster가 붙어있는지 확인하 없다면 컴포넌트를 추가한다.
  • 2D ▶ MainCamera에 Physics 2D RayCaster가 붙어있는지 확인하 없다면 컴포넌트를 추가한다.
  • 다른 오브젝트가 충돌되지 않도록 Event Mask를 설정한다.

 

위 두 가지만 확인해본다면 이벤트 호출이 정상적으로 될 것이다.


 

여기서 이벤트 함수를 게임 오브젝트가 아닌 UI에 넣는다면 MainCamera Physics RayCaster를 추가하지 않아도 이벤트가 호출 될 것이다.

 

왜 그럴까 ?

 

 

OnPointerEnter and OnPointerExit not being triggered Unity

Alright so basically the issue that I've been having is that for some reason a GameObject is interfering with the OnPointerEnter function. I'm pretty sure that OnPointerEnter detects only UI. So th...

stackoverflow.com

이 글의 내용은 OnPointerEnter, ExitUI에만 적용된다는 글이다.

 

하지만 댓글을 본다면 UI에만 적용되는 이유와, 게임 오브젝트에 반응할려면 어떻게 해야하는지 나와있다.

 

 

일단 이유는 기본적으로 Canvas를 생성하면 기본적으로 Graphic Raycaster가 붙어 있기 때문에 UI에는 해당 이벤트 함수들이 반응을 하는 것이다. ( Graphic Raycaster의 구성요소를 사용하여 이벤트를 호출)

 

 

Graphic Raycaster | Unity UI | 1.0.0

Graphic Raycaster The Graphic Raycaster is used to raycast against a Canvas. The Raycaster looks at all Graphics on the canvas and determines if any of them have been hit. The Graphic Raycaster can be configured to ignore backfacing Graphics as well as be

docs.unity3d.com

 

그렇기 때문에 UI가 아닌 게임 오브젝트에서 이벤트 함수들을 호출할려면 MainCamera Physics RayCaster/ Physics 2D RayCaster 를 추가해서 이벤트 함수를 호출해야한다.