본문 바로가기
유니티/기초

유니티 UI 이벤트(Event)

by 노튜 2020. 11. 23.
728x90

1. 이벤트 시스템 (EventSystem)

 

이벤트 시스템(EventSystem)은 씬에서 입력(Input), 레이 캐스트(Raycast), 전송 이벤트 처리 등을 담당한다. UI를 생성하면, 이벤트 시스템이 함께 생성된다. 이벤트 시스템은 모듈 간의 통신 관리자 및 진행자로 설계되어, 이벤트 시스템을 직접적으로 사용하여 이벤트 처리를 하지 않는다. 

 

 

2. UI 이벤트 처리

유니티는 다양한 이벤트를 처리하기 위한 인터페이스를 제공하며, 이벤트가 발생하면 호출이 되도록 구성한다. 클릭, 키보드 입력, 터치 등이 이벤트이다.     

 

2.1 UI 이벤트 처리 - 상호작용 컴포넌트 

UI 요소 중에서 상호작용이 가능한 요소들이 있다. 버튼( Button ), 토글(Toggle) and 토글 그룹( Toggle Group ), 슬라이더( Slider ), 스크롤바( Scrollbar), 드롭다운( Dropdown ), 인풋 필드(InputField) 그리고 스크롤 렉트( ScrollRect )이다.  상호작용 컴포넌트들은, 이벤트를 처리하기 위한 이벤트 리스너를 추가할 수 있는 옵션을 가지고 있다. 

 

버튼을 예로 들어, Button 옵션에 OnClick()이 있다(아래 이미지 참조.).

OnClick()의 오른쪽 하단의 + 버튼을 선택하고, 이벤트가 발생하면 호출되는 함수를 등록하면 된다. 

 

Button OnClcik()


리스너 추가

  1. 함수를 포함하고 있는 해당 게임 오브젝트를 드래그를 사용해 등록한다. 
  2. NoFunction을 선택한다. 
  3. 처리를 담당할 함수를 등록한다.   

add Event Listener



대상 게임 오브젝트는 무조건 UI에 존재하지 않아도 상관없다. 

하지만 이벤트를 처리하는 함수는 반드시 public으로 선언되어 있어야 한다. 

 

using UnityEngine;

public class LevelManager : MonoBehaviour
{
    public void OnButtonClicked()
    {
        // Do something.
    }
}

 

2.2 UI 이벤트 처리 - AddListener()

버튼의 인스턴스에 직접 접근해 동적으로 리스너를 등록하는 방법이다. 버튼에 리스너를 등록하고, 이벤트가 발생하면, 함수가 호출되는 것은 앞의 방법과 동일하다. 하지만 버튼의 인스턴스를 스크립트에서 접근하므로, 실시간으로 등록 및 해제가 가능하다는 장점을 갖는다.   

 

UnityEngine.UI 네임스페이스를 추가하고, public으로 Button 변수를 추가한다. 

게임 오브젝트가 활성화되면, 리스너를 등록하도록 구현한다. 

 

using UnityEngine;
using UnityEngine.UI;

public class LevelManager : MonoBehaviour
{
    public Button eventButton;

    // Start is called before the first frame update
    void Start()
    {
        // Add
        eventButton.onClick.AddListener(OnMyButtonClicked);
        // Remove
        //eventButton.onClick.RemoveListener(OnMyButtonClicked);
    }

    // Update is called once per frame
    void Update()
    {

    }

    public void OnMyButtonClicked()
    {
        //Do something.
    }
}

 

3. 비주얼 UI 요소

버튼은 클릭 이벤트가 발생하면 호출되는 이벤트 리스너를 가지고 있다. 하지만 Image 컴포넌트와 같은 비주얼 UI 요소는 기본적으로 제공하지 않는다. 이에 이벤트를 수신하고 처리하기 위한 방법이 요구된다. 

유니티는 이벤트가 발생하면 호출되는 인터페이스를 제공한다. 비주얼 UI 요소가 직접 처리하지는 않지만, 비주얼 UI 요소를 추가한 게임 오브젝트에 스크립트를 추가하여, 이벤트를 수신하도록 할 수 있다. 

 

유니티 이벤트 시스템에서 제공하는 이벤트 인터페이스는 아래와 같다. 

 

인터페이스  인터페이스 함수 설명
IPointerEnterHandler OnPointerEnter 포인터가 대상 게임오브젝트에 들어왔을 때
IPointerExitHandler OnPointerExit 포인터가 대상 게임 오브젝트에서 빠져나갈 때
IPointerDownHandler OnPointerDown 포인터가 대상 게임 오브젝트를 눌렀을 때 
IPointerUpHandler OnPointerUp 포인터가 누르고 있던 대상 게임 오브젝트에서 떼었을 때
IPointerClickHandler OnPointerClick 포인터가 대상 게임오브젝트를 누르고 떼었을 때 
     
IInitializePotentialDragHandler OnInitializePotentialDrag 드래그 대상이 발견되었을 때 호출.
IBeginDragHandler OnBeginDrag 드래그 시작 직전에 드래그 대상 오브젝트에서 호출
IDragHandler OnDrag 드래그 대상이 드래그 중일때 호출
IEndDragHandler OnEndDrag 드래그가 종료했을 때 드래그 대상 오브젝트에서 호출
IDropHandler OnDrop 드래그를 멈춘 위치에 있는 오브젝트에서 호출
     
ISelectHandler OnSelect 오브젝트가 선택된 순간 해당 오브젝트에서 호출
IDeselectHandler OnDeselect 선택중인 오브젝트에서 선택 상태가 해제될 때 호출
IUpdateSelectedHandler OnUpdateSelected 선택 중인 오브젝트에서 매 프레임 호출
     
IScrollHandler OnScroll 마우스 휠 스크롤했을 때 호출
IMoveHandler OnMove 키 입력에 의한 이동 이벤트가 발생했을 때 호출(왼쪽, 오른쪽, 위, 아래 등)
ISubmitHandler OnSubmit Submit 버튼을 눌렀을 때 호출
ICancelHandler OnCancel 취소 버튼을 눌렀을 때 호출

출처 : https://docs.unity3d.com/kr/530/Manual/SupportedEvents.html



3.1 UI 이벤트 리스너 등록

UI Image 컴포넌트를 생성하고, EventExample class를 추가한다. 

 

Add EventExample

 

이벤트 핸들러를 사용하기 위해서는 EventSystems 네임 스페이스를 등록해야 한다.

using UnityEngine.EventSystems;

Button과 같이 클릭 이벤트가 발생하면 호출되도록 인터페이스를 추가한다. 인터페이스를 추가하는 방법은 클래스와 동일하다. 인터페이스를 추가하면, 인터페이스 함수를 반드시 등록해야 한다. 

 

Visual studio의 경우 자동으로 추가하는 기능이 있다.

아래 이미지와 같이 에러 마크를 선택해 인터페이스 구현을 누르면 생성된다.

 

Generate Interface function

 

아래의 예제 코드는 이벤트가 발생하면, 콘솔 창에 Log를 출력한다. 

PointerDown, PointerUp은 눌렀을 때, 누른 상태에서 떼었을 때이며, PointerDown과 PointerUp이 일어나면 후에 PointerClick 이벤트가 호출된다. 

 

using UnityEngine;
using UnityEngine.EventSystems;

public class EventExample : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerEnterHandler, IPointerExitHandler, IPointerUpHandler
{

    // Start is called before the first frame update
    void Start() {      
    }

    // Update is called once per frame
    void Update() {     
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        // 클릭 이벤트가 발생하면 호출된다. 
        // 클릭 이벤트가 호출되면 수행하는 로직을 구성한다. 
        Debug.Log("PointerClick");
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("PointerDown");
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("PointerEnter");
        //throw new System.NotImplementedException();
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("PointerExit");
        //throw new System.NotImplementedException();
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("PointerUp");
        // throw new System.NotImplementedException();
    }
}
728x90