본문 바로가기
유니티/개념 정리

EventSystem

by fore4022 2024. 10. 7.

 

여러 환경과 사용자가 지정 입력에 맞추어서 호출되는 Event이다.

기본적으로는 UI와 입력에 따른 상호작용에 동작 구현에 사용된다. 입력은 마우스나 터치와 같은, 포인터에 대한 입력을 다룬다.

객체와 다양한 상호작용을 구현하는데 많이 사용된다.


장점

  • 직접 RayCasting을 통해서 포인터에 대한 동작을 구현할 필요 없다.
  • 여러 디바이스 환경에서 동작한다.

EventSystem Interface

EventSystem의 사용을 위해서는 Interface를 상속받아서, 구현해 주어야한다.

다양한 입력의 Interface가 있고, 사용자가 별도로 만들 수 있다. 각 Interface는 받는 입력의 종류와 입력의 형태가 다르다.

using UnityEngine;
using UnityEngine.EventSystems;
public class EventSystem_Test : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    public void OnPointerEnter(PointerEventData eventData)
    {

    }

    public void OnPointerExit(PointerEventData eventData)
    {

    }
}
  • Custom EventSystem : 사용자에 맞게 따로 Messaging System을 이용해서 구현할 수 있다.

Messaging System

메서드나 함수의 이름을 통해서 호출하는 방식으로, 매개변수를 전달할 수 있다. Messaging System은 Event와 유사한 기능을 가지고 있다. 하지만 성능, 유지보수, 가독성 측면에서 Messaging System보다 뛰어나므로, Event의 사용을 권장한다.

PointerEventData

포인터 입력 종류에 맞는 입력 값을 가진다.

"마우스 좌클릭 = 0, 마우스 우클릭 = 1, Press, Drag 등"
  • PointerEventData는 클래스 내부는, 각 입력에 해당하는 Getter와 Setter로 이루어져 있다.
  • EventSystem(UI - EventSystem)에서 입력이 발생하면, 새로운 PointerEventData를 생성하고, 입력에 맞는 Setter에 값을 할당한다.
  • 사용자가 클래스에서 인터페이스 구현을 통해 전달받은 PointerEventData의 정보를 사용하여서 동작을 구현한다.
    • 예시
    "받아온 PointerEventData가 좌클릭인지, 우클릭인지에 따라서 다른 동작을 수행한다."
    

UI와 일반 객체

EventSystem은 UI와 일반적인 객체 모두 사용 가능하다.

차이점

  • UI
    • Graphic RayCaster를 사용한다.
  • 일반 객체
    • 2D, 3D 환경에 따라서 Physics RayCaster, 3D Physics RayCaster를 사용한다.
    • Collider가 있어야 입력을 받을 수 있다.
    • 카메라에 위의 RayCaster 컴포넌트를 붙여줘야 한다.

일반 객체에서는 간단한 구현을 원한다면, EventSystem을 사용하여도 좋다. 하지만 RayCast를 이용한 물리적으로 상호작용이 있거나, 성능을 향상 시켜야 하는 경우는 Collider과 RayCasting을 이용하는 것이 더 좋다.


부모, 자식 관계

EventSystem에서는 객체의 부모, 자식 관계에 따라서, 호출되는 경우의 수가 달라진다.

위의 설명에서는 RayCast를 이용하여서 EventSystem이 동작하는 것으로 설명 되었다. 그렇다면 아래의 경우에는 어떻게 동작하나?

예시 상황

"기능을 가지고 있는 버튼 위에 이미지를 삽입하였다."

RayCast를 하였을 때 이미지가 먼저 감지되었기에 ‘버튼이 동작을 하지 않는다.’라고 생각할 수 있다.

하지만, 우리가 평상시에 사용하던 버튼을 생각해 보자. 버튼 위에 이미지나 글자가 있을 때, 이미지나 글자를 눌러도 버튼이 작동하지 않았는가? 위와 같은 동작은 이벤트 버블링을 통해서 이루어진다.

이벤트 버블링(Bubbling)

 

이벤트 버블링(Bubbling)

이벤트 발생 시 할당된 핸들러가 동작한 후, 상위 요소의 핸들러가 동작하도록 이벤트를 전달해 준다.이벤트 핸들러(Event Handler) : 이벤트가 발생할 때 호출되는, 메서드나 함수롤 말한다.이벤트

fore4022.tistory.com


주의할 점

  • MonoBehaviour를 상속받은 클래스에서만 동작한다.
  • EventSystem은 매 프레임에 맞추어서 입력 상태를 확인한다. 때문에 구현한 동작의 호출이, 입력이 발생한 직후로 보장되지 않을 수 있다.
  • UI에서는 입력의 발생을 RayCast를 통해서 진행하기에, RayCasting이 활성화되어 있어야 한다.
  • EventSystem이 없이는 동작하지 않는다. ( UI - EventSystem를 통해서 생성할 수 있다.)

'유니티 > 개념 정리' 카테고리의 다른 글

MonoBehaviour  (0) 2024.10.10
UI 사이의 Event 전달  (0) 2024.10.07
ScriptableObject  (0) 2024.09.30
관찰자 패턴(Observer Pattern)  (0) 2024.09.26
상속  (0) 2024.09.23