public enum UIEvent
{
Click,
Drag,
}
UIEvent의 타입을 구분하기 위해 선언하였다.
public Action<PointerEventData> OnClickHandler = null;
public Action<PointerEventData> OnDragHandler = null;
public void OnPointerClick(PointerEventData eventData)
{
if (OnClickHandler != null)
OnClickHandler.Invoke(eventData);
}
public void OnDrag(PointerEventData eventData)
{
if (OnDragHandler != null)
OnDragHandler.Invoke(eventData);
}
클릭과 드래그하는 액션 두 개를 선언하였다.
// 컴포넌트가 있으면 그냥 반환, 없으면 추가해서 반환해주는 함수
public static T GetOrAddCompoent<T>(GameObject go) where T : UnityEngine.Component
{
T component = go.GetComponent<T>();
if (component == null)
component = go.AddComponent<T>();
return component;
}
public static void AddUIEvent(GameObject go, Action<PointerEventData> action, Define.UIEvent type = Define.UIEvent.Click)
{
UI_EventHandler evt = Util.GetOrAddCompoent<UI_EventHandler>(go);
switch(type)
{
case Define.UIEvent.Click:
evt.OnClickHandler -= action;
evt.OnClickHandler += action;
break;
case Define.UIEvent.Drag:
evt.OnDragHandler -= action;
evt.OnDragHandler += action;
break;
}
}
게임오브젝트에 존재하는 UI_EventHandler.cs에 접근 또는 컴포넌트를 추가하는 함수이다.
클릭이냐, 드래그냐에 따라 어떤 핸들러에 적용할지 구분된다.
// Extension의 경우 static class
public static class Extension
{
// go 앞에 this를 추가
// go.AddUIEvent가 가능하다.
public static void AddUIEvent(this GameObject go, Action<PointerEventData> action, Define.UIEvent type = Define.UIEvent.Click)
{
UI_Base.AddUIEvent(go, action, type);
}
}
GameObject.AddUIEvent(...)가 가능해진다.
void Start()
{
Bind<Button>(typeof(Buttons));
Bind<Text>(typeof(Texts));
Bind<GameObject>(typeof(GameObjects));
Bind<Image>(typeof(Images));
GetButton((int)Buttons.PointButton).gameObject.AddUIEvent(OnButtonClicked, Define.UIEvent.Click);
GameObject go = GetImage((int)Images.ItemIcon).gameObject;
AddUIEvent(go, (PointerEventData data) => { go.transform.position = data.position; }, Define.UIEvent.Drag);
}
int _score = 0;
public void OnButtonClicked(PointerEventData data)
{
_score++;
GetText((int)Texts.ScoreText).text = $"점수 : {_score}";
}
Extension 덕분에 GetButton을 통해 얻은 게임오브젝트에서 바로 AddUIEvent()를 실행할 수 있다.