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가 붙었고, 드래그도 잘 되고있다.