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; });

