카테고리 없음

[내일배움캠프 38일차] 이거 왜 안 눌리나요? EventSystem이 없다고요?

티백고래 2025. 5. 30. 22:51

1. 오늘은 무슨 일이 터졌나

 

상호작용을 했다.

그런데 버튼이 안눌린다.

아무리 눌러도 안 눌린다.

그런데 다른 씬에서는 눌린다.

 

뭐가...문제지...뭐가.....?

2. 정답


@: EventSystem이 있는지 확인 해보셨나요?

나: 에?

 


EventSystem이란?
:

이벤트 시스템

이벤트 시스템은 키보드, 마우스, 터치, 커스텀 입력 등 입력 기반 애플리케이션의 오브젝트에 이벤트를 전송하는 방법입니다. 이벤트 시스템은 이벤트를 전송에 함께 작용하는 일부 컴포넌트로 구성됩니다.

이벤트 시스템(Event System) 컴포넌트를 게임 오브젝트에 추가할 때 이벤트 시스템 자체가 이벤트 시스템 모듈 사이에서 커뮤니케이션에 매니저 및 퍼실리테이터로 설계되어 있기 때문에 많은 기능이 노출되지 않습니다.

이벤트 시스템의 주요 역할은 다음과 같습니다.

 

  • 어떤 게임 오브젝트를 선택할지 관리
  • 어떤 입력 모듈을 사용할지 관리
  • 레이캐스팅 관리(필요 시)
  • 필요에 따라 모든 입력 모듈 업데이트

출처 : 이벤트 시스템 - Unity 매뉴얼

 

즉 EventSystem을 할당하지 않았다는 것 = 영원히 활성화 되지 않는 가짜버튼 되시겠다

하지만 EventSystem도 그냥 혼자 작동하진 않을 것이다.

그래서 UI들을 보면 캔버스 부분에 당당하게 자리 잡고 있는 것이 있는데, Canvas GameObject와 함께 생성되는 Graphic Raycaster 컴포넌트가 바로 그것이다.

CanvasScaler랑 같이 붙어있는 저것이다.

그럼 Graphic Raycaster 컴포넌트의 역할은 무엇인가?
Raycast....? 선..감지....? 없으면 버튼이 안 눌려...?

=> UI위에 마우스가 있는지 감지하는 역할이구나!

그럼 좀 더 정확하게 어떤 구조로 움직이는가?

1. Canvas 위에 UI를 그린다 

2. 마우스가 화면에 올라가면, Graphic Raycaster가 마우스의 위치를 받아온다. (RaycastHit과 같은 느낌인가보다)

3. 마우스가 클릭을 하면, 그 상호작용이 일어난 곳을 Raycaster가 EventSystem에 전달한다..

4. 그럼 EventSystem이 해당 버튼/혹은 다른 UI에 할당된 Event에 감지여부를 전달한다.

5. 최종적으로 할당된 함수가 작동한다. (가령, OnUseButton 같은 것)

 

이런 이유로, EventSystem은 한 씬에 1개만 존재할 수 있다.

왜? => 1차적 이유로는 Unity에서 WarningLog로 이벤트 시스템 2개라고 계속 혼낸다. 애초에 그렇게 만들지 말라고 되어있는 것이다.

2차적 이유로는, EventSystem의 역할을 보면 어느정도 이해가 된다. Canvas는 여러 개 있어도 상관없다. 도화지고, 여러가지를 그려내는 것이니까.

하지만 EventSystem은 Event가 발동했을 때 해당 내용을 담당 위치에 전달하는 역할이다. 그런데 이게 2개라면, 감지하는 역할이 2개. 똑같은 감지를 하고 똑같이 내용 전달을 하는 게 둘....

=>중복으로 이벤트 호출을 하는 것이나 다름없다

그러니 EventSystem은 1개로 고정하여 사용하도록 Unity에서 (WarningLog를 띄우지만 사실상) 강제하는 것이다.

 

3. 마무리

생각 이상으로 별 것 아닌 이유라 기운이 빠진 사건...

(Discord에서 머가 문제일까요 그러게요....를 반복하던 시간을 떠올린다)

하지만? 이제 EventSystem의 쓰임을 알았으니 버튼이 안 눌릴 때는 먼저 살펴보게 되지 않을까....