Priv's Blog
겹쳐진 UI 오브젝트, 게임 오브젝트가 동시에 클릭될 경우 본문
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)에서 포인터(마우스, 터치 등)가 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();
}
}
}
}
수고하셨습니다!
'Dev. Study Note > Unity' 카테고리의 다른 글
C# EventHandler 중복 호출 방지법 (0) | 2024.10.22 |
---|---|
움직임(물리)을 구현하자 (0) | 2024.10.15 |
Unity Event vs Delegate Event (0) | 2024.10.06 |
SerializeField 속성과 변수 초기화, Null 참조 에러 (0) | 2024.07.28 |
세션 간의 데이터 지속성 (JsonUtility & NewtownSoft Json) (0) | 2024.06.14 |
Comments