Priv's Blog

겹쳐진 UI 오브젝트, 게임 오브젝트가 동시에 클릭될 경우 본문

Dev. Study Note/Unity

겹쳐진 UI 오브젝트, 게임 오브젝트가 동시에 클릭될 경우

Priv 2024. 12. 21. 14:31


 

 

1. 개요

UI 오브젝트와 게임 오브젝트가 겹쳐진 상태로 배치되어 있을 경우, 클릭 이벤트를 감지할 때 겹쳐진 두 종류의 오브젝트가 동시에 반응하는 문제가 발생할 수 있습니다.

public class GameControlObjectClickController : MonoBehaviour {
    private void OnSelect() {
        Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());

        if (Physics.Raycast(ray, out RaycastHit hit)) {
            if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Clickable Object")) {
                hit.transform.gameObject.GetComponent<IGameControlClickableObject>().OnClick();
            }
        }
    }
}

 

 


 

2. IsPointerOverGameObject( )


 

EventSystems.EventSystem-IsPointerOverGameObject - Unity 스크립팅 API

Is the pointer with the given ID over an EventSystem object?

docs.unity3d.com


헤당 메서드는 EventSystems 라이브러리의 메서드로 특정 입력 시스템(EventSystem)에서 포인터(마우스, 터치 등)가 UI 오브젝트 위에 있는지를 판단하여 bool 값을 반환합니다.

매개변수로 int 형 변수, pointerId를 제공할 수 있으며, 각 입력의 ID를 명시해주면 해당 포인터에 대한 검사를 진행할 수 있습니다.
(이는 멀티 터치와 같은 다중 입력을 처리할 때 활용합니다)

만약 매개변수를 생략하면 현재 활성화된 포인터에 대한 검사만 처리합니다.

즉, 여기서는 UI 오브젝트를 클릭했다면 true를 반환, 오브젝트 클릭 처리 자체를 생략하도록 하면 됩니다.

public class GameControlObjectClickController : MonoBehaviour {
    private void OnSelect() {
        if (EventSystem.current.IsPointerOverGameObject()) {    // UI 오브젝트 클릭 시 true
            return;
        }
        
        Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());

        if (Physics.Raycast(ray, out RaycastHit hit)) {
            if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Clickable Object")) {
                hit.transform.gameObject.GetComponent<IGameControlClickableObject>().OnClick();
            }
        }
    }
}

 


 


수고하셨습니다!


Comments