부트캠프

델리게이트를 이용해서 UI를 구성하기

noyyo 2023. 10. 12. 21:46

UI화면을 띄워야 할 때 같은 UI를 사용하지만 안의 내용이 달라져야 하는 경우가 있다.

위와 같은 UI를 사용한다고 했을 때 해당 팝업은 여러 용도로 쓰일 수 있다.

하지만 같은 UI더라도 안에서 동작하는 스크립트는 달라져야 한다. 이럴 때 가장 쉽게 떠올릴 수 있는 방법은 필요한 용도마다 새로운 스크립트를 짜는 것이다.

예를 들면 StoreUI, InventoryUI, QuestUI 등 그때 그때 필요한 기능을 구현한 스크립트를 추가하고 새로운 UI를 만들어 사용하는 것이다.

구조에 관해 고민할 필요가 없고 구현에만 집중하면 되기 때문에 UI의 개수가 그렇게 많지 않다면 그렇게 나쁜 방법은 아닌 것 같다.

 

하지만 만약에 UI가 점점 많아져서 해당 팝업이 5군데, 10군데, 20군데 이렇게 끝도 없이 늘어나는 상황이라면 매 번 해당스크립트를 짜는 것은 굉장한 낭비가 된다.

게다가 UI를 여러개 생성하면 리소스 낭비까지 이뤄진다.

이럴 때 델리게이트를 사용해서 팝업 창이 필요한 기능을 받아와서 사용할 수 있도록 구성할 수 있다.

 

● 델리게이트란?

델리게이트(delegate)는 대리자라고도 한다.

말 그대로 뭔가를 대리하는 것인데 무엇을 대리하냐면 바로 메소드, 함수를 대리한다.

변수가 필드, 혹은 변수를 담는 그릇이라면 델리게이트는 메소드, 함수를 담는 그릇이다.

사용하는 방법은 메소드, 함수 선언과 동일하다. 앞에 delegate라는 키워드만 붙여주면 된다.

그리고 해당 delegate는 하나의 타입이 된다.

public delegate void Testdelegate();

private void Test()
{
    // new를 통해 인스턴스를 생성하면서 해당 타입과 맞는 메소드를 담기
    Testdelegate testDelegate = new Testdelegate(TestDeleagte);

    // 대입 연산자를 통해서 해당 타입과 맞는 메소드를 담기. (New 없어도 된다)
    testDelegate = TestDeleagte;

    // 담긴 메소드를 실행하기.
    testDelegate.Invoke();
}

위처럼 간단하게 선언하고 사용할 수 있다.

 

● 델리게이트를 통해서 콜백을 받기

Callback은 쉽게 말하자면 "이거 해주세요"다.

일반적으로 어떤 작업을 마치고 나서 이 작업을 해주세요~ 혹은 이런 방법으로 작업해주세요~와 가깝다.

함수, 즉 행동이나 기능등을 넘겨주는 것이다.

이 함수나 행동을 넘겨주기 위해서 델리게이트를 매개변수로 사용할 수 있다.

private void TestCallBack(Testdelegate testDelegate)
{
    // TODO : 필요한 작업 수행

    // 작업을 마친 후 요청한 콜백을 수행
    testDelegate.Invoke();
}

이런 식으로 사용한다. 이벤트와 같이 사용되는 경우도 많다. 대표적으로 OnClicked와 같은 이벤트에 AddListener를 하는 것이다.

또 어떤 방법으로 작업해주세요와 같이 사용되기도 한다. 대표적으로 Find에서 delegate를 받아 해당하는 기능에 적합한 것을 찾는 keySelector같은 것이 있다.

어떻게 사용하던지 간에 기능을 넘겨줄 수 있다는 것이 중요하다.

 

● UI에서 델리게이트로 필요한 기능을 받아오기

이제 맨 처음 팝업처럼 해당하는 UI마다 매번 다른 코드를 짜고 같은 UI를 재생성하지 않아도 된다.

단순하게 UI를 초기화 하는 메소드에서 수행해야 할 기능을 델리게이트로 받아오자.

private void Initialize(Testdelegate callBack)
{
    // 확인 버튼을 누르면 해당 기능을 수행하도록 초기화하기.
    if (cofirmButtonClicked())
        callBack.Invoke();
}

이런 식으로 해당하는 UI마다 수행될 기능을 받아서 조건을 만족했을 때 수행하도록 한다면 코드의 반복과 리소스 사용을 줄이고 UI추가할 때마다 팝업과 관련된 코드를 건드릴 필요 없이 추가될 UI에 대한 코드만 구현하면 된다.

'부트캠프' 카테고리의 다른 글

원을 따라 움직이는 적 구현  (0) 2023.10.20
NavMeshAgent와 CharacterController를 이용한 점프  (0) 2023.10.18
유니티 Navigation  (0) 2023.10.10
드래그 앤 드롭을 구현하기  (0) 2023.10.06
ToggleGroup  (0) 2023.09.26