Unity Engine/Unity UI

[유니티] UI 자동화 #3: Event

Muru 2023. 11. 30. 14:13
PointerEventData: 이벤트 시스템에서 포인터 이벤트(마우스, 터치)등을 처리할 때 사용한다.

포인트 위치추적(커서),이벤트 타입 식별, 대상 식별, 
드래그 앤 드롭, 클릭 횟수 및 버튼 종류 등의 입력 정보를 알수있게 된다.

 

이벤트 방식을 쓰려면 당연하게도 Callback을 이용해야한다. UI_EventHandler를 생성하고, 기존 UI에 Image를 추가해준다. 그렇다면 생성된 이미지를 드래그해서 옮겨보도록하자.

 

 

드래그 첫 클릭때 발생하는 IBeginDragHandler, 드래그시에 발동되는 IDragHander 인터페이스를 추가하고

transform.position을 이벤트데이터(현재 마우스 위치)로 이동시키도록 해보자.

 

 

가볍게 인터페이스로 구현한고  transfrom.position을 eventData에 포지션으로 적용시켰더니 손쉽게 이동이 가능해진다.

(대상 오브젝트의 UI_EventHandler.cs가 붙어있다는 조건하에)

 

테스트가 끝났으므로, 이 두 드래그에 콜백함수를 연결해서 실행시키도록 만들면 된다.

public class UI_EventHandler : MonoBehaviour, IBeginDragHandler, IDragHandler
{
    public Action<PointerEventData> onBeginDragHandler = null;
    public Action<PointerEventData> onDragHandler = null;
    
    public void OnBeginDrag(PointerEventData eventData)
    {
    	if (onBeginDragHandler != null)
           onBeginDragHandler.Invoke(eventData);
    }
    
    public void OnDrag(PointerEventData eventData)
    {
        if (onDragHandler != null)
           onDragHandler.Invoke(eventData);
    }
}

 


 

연동

 

 

계속 작성하던 곳에 enum값으로 Images를 생성해주고 바인딩을 해줘야한다.여기까진 계속 했던것이라 쉽죠?

 

public class UI_Button : UI_Base
{
    private void Start()
    {
        //
        Bind<Image>(typeof(Images));
		//
        GameObject go = GetImage((int)Images.ItemIcon).gameObject;
    }
    
    GetImage으로 ItemIcon을 가져왔으니, 이미지를 가져와야할 것 같지만
    게임오브젝트로 가져온 이유는, 당장 이미지를 뽑아올것이 아니라, 
    ItemIcon이미지의 게임오브젝트에 붙어있는 UI_EventHander.cs를 손볼것이기 때문이다.

 

이미지는 비어있고, 코드로 해야할것은 UI_EventHandler 컴포넌트를 추가하던 가져온다.

	//...
    GameObject go = GetImage((int)Images.ItemIcon).gameObject;
    UI_EventHandler evt = go.GetComponent<UI_EventHandler>();

추출을 해준다.

이후 람다식으로 추가까지해준다면 완료.

    UI_EventHandler evt = go.GetComponent<UI_EventHandler>();
    evt.onDragHandler += ((PointerEventData data) => 
    { evt.gameObject.transform.position = data.position; });