Unity Engine/Unity UI
[유니티] UI 자동화 #4: AddComponent
Muru
2023. 11. 30. 15:39

지난번에 이벤트를 작성을했다. 이벤트를 하나하나 추가하지않고 깔끔하게 바꾸는 방법을 알아보자.
UI_EventHandler evt = go.GetComponent<UI_EventHandler>();
evt.onDragHnalder += ((PointerEventData data) => { evt.gameObject.transform.position = data.position; });
부분을 복사해서 UI_Base로 넘어간다.
public static void AddUIEvent()
{
UI_EventHandler evt = go.GetComponent<UI_EventHandler>();
evt.onDragHnalder += ((PointerEventData data) => { evt.gameObject.transform.position = data.position; });
}를
넣어주면, AddUIEvent() 매개변수안에 게임오브젝트와 콜백으로 받을 함수,
Drag인지 Click인지알아볼 값이 필요하다.
public class Define
{
public enum UIEvent
{
Click,
Drag
}
}
====================
public static void AddUIEvent(GameObject go, Action<PointEventData> action,
Define.UIEvent type = Define.UIEvent.Click)
{
UI_EventHandler evt = go.GetComponent<UI_EventHandler>();
evt.onDragHnalder += ((PointerEventData data) =>
{ evt.gameObject.transform.position = data.position; });
}
======================
GameObject go, 액션값 action, 기본상태인 click을 넣었다.

이제 컴퍼넌트가 없어도 알아서 추가해주는 코드를 적어야한다.
public static void AddUIEvent(~~)
{
UI_EventHandler evt = go.GetComponent<UI_EventHandler>();
if (evt == null)
evt = go.AddComponent<UI_EventHandler>();
//evt += ~~
}
라고 적어준다. 그러나, 이 컴퍼넌트 추가는 정말 많이 쓰이기에 Util에 옮길것이다.
public class Util
{
public static T GetOrAddComponent<T>(GameObject go)
{
UI_EventHandler evt = go.GetComponent<UI_EventHandler>();
if (evt == null)
evt = go.AddComponent<UI_EventHandler>();
//옮겨주고 컴퍼넌트를 T, 값을 아래와 같이 공통적으로 변환한다.
T component = go.GetComponent<T>();
if (component == null)
component = go.AddComponent<T>();
return component;
}
//public static GameObject FindChild ~~
//public static T FindChild<T> ~~
}
public static void AddUIEvent(~~)
{
UI_EventHandler evt = Util.GetOrAddComponent<UI_EventHandler>(go);
//evt += ~~
}
이러면 이제 자동을 컴퍼넌트에 추가가 될것이다.
이제 타입에 따라 연동을 시켜보자! (Define.UIEvent)

이제 다시 UI_Button.cs로가서 활용해보자.


손쉽게 매개변수 그대로 작성해주면된다. go, 액션은 밑에 있는 람다값, 디파인은 onDragHanlder라 써있으니 drag로.
그리고 밑에 부분은 지워주면 완료.



이제 ItemIcon에 스크립트는 아무것도 없었으나, UI_EventHandler가 붙었고, 드래그도 잘 되고있다.