공부 기록/유니티 Unity

[Unity/TIL] delegate, Action 활용 - UI 팝업창

톰마토 2025. 2. 28. 23:04
728x90

Action 개요

delegate와 Func, Action 등에 대해서 공부했었는데 사용하고 싶을 때 바로 사용하기가 쉽지 않았다. 그래서 오늘은 UI 구현 시에 delegate를 활용하는 예제로 공부했다. 

 

예전 공부 글 : https://ramenkirby.tistory.com/34

 

[C#] Delegate, Lambda, Func와 Action, LINQ

목차델리게이트 (Delegate)   ㄴ 이벤트 (Event)람다 (Lambda)Func와 ActionLINQ (Langauge Integrated Query) 델리게이트 (Delegate)키워드 : delegate 다른 언어에서의 함수 포인터 개념으로 생각하면 된다.  하나의

ramenkirby.tistory.com

Action은 C#에서 제공하는 내장 delegate로, 반환값이 없는 delegate이다. 매개변수가 있는 Action이라면 Action<매개변수1 타입, 매개변수2 타입,... > 이렇게 제네릭으로 쓰면 된다.

Action을 활용한 UI 팝업창

팝업창 UI를 예시로 생각했을 때, 팝업창을 띄우는 상황은 굉장히 다양하다. 팝업창의 메세지와 예/아니오 버튼 클릭 시 실행할 행위가 모두 다를 것이다. 그에 대한 팝업 UI를 각각 만들어 주는 것은 비효율적이다. 덜 비효율적으로 작성한다면 Enum 등으로 상황에 따라 다른 메세지를 띄우고 실행 함수를 실행하도록 할 수 있겠다. 하지만 Action을 사용한다면 확장성이 더 좋은 팝업 UI를 만들 수 있다. 

 

1. UIManager 

UIManager에서 public으로 팝업UI를 들고 있고, 팝업 UI를 띄우기 위한 함수가 UIPopup 내부에 있다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIManager : MonoBehaviour
{
    public static UIManager Instance { get; private set; }

    public UIPopup UIPopup;

    private void Awake()
    {
        Instance = this;
    }
}

 

2. UIPopup 

팝업창을 세팅할 수 있는 함수가 이곳에 있다.

  • SetPopup 함수를 통해 띄울 메시지와 OK버튼/NO버튼 클릭 시 실행할 함수를 모두 지정할 수 있도록 했다. 
  • 버튼에는 미리 Action을 AddListener로 연결해 두었고, 외부에서 SetPopup 함수를 통해 그 Action에 지정하는 것이다.
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class UIPopup : MonoBehaviour
{
    public Action OkAction;
    public Action NoAction;

    [SerializeField] private TextMeshProUGUI txtMessage;
    [SerializeField] private Button btnOK;
    [SerializeField] private Button btnNo;

    private void Start()
    {
        btnOK.onClick.AddListener(OnClickOK);
        btnNo.onClick.AddListener(OnClickNo);
    }
    public void SetPopup(string text, Action confirmAction, Action denyAction)
    {
        txtMessage.text = text;
        OkAction += confirmAction;
        NoAction += denyAction;
    }

    void OnClickOK()
    {
        if(OkAction != null)
            OkAction();
        //gameObject.SetActive(false);  // 원래는 선택 시 꺼지는 것이 팝업창의 역할이 맞음
    }
    void OnClickNo()
    {
        if (NoAction != null)
            NoAction();
        //gameObject.SetActive(false);  // 원래는 선택 시 꺼지는 것이 팝업창의 역할이 맞음
    }

}

UIPopup의 인스펙터 창

3. 팝업창 띄우는 곳

지금은 테스트 프로젝트라서 Player 객체 Start 함수에서 했다..ㅋㅋ 

아래 코드만 사용하면 원하는대로 팝업창을 띄울 수 있다!

UIManager.Instance.UIPopup.SetPopup("나봉이는 귀엽습니까?", ColorChange, ColorChangeReverse);

 

예시로 사용한 함수는 아래와 같다. OK를 클릭하면 Player의 스프라이트 Color값을 red로, No를 클릭하면 white로 변경하는 팝업창을 세팅한 것이다.

private void ColorChange()
{
    GetComponent<SpriteRenderer>().color = Color.red;
}
private void ColorChangeReverse()
{
    GetComponent<SpriteRenderer>().color = Color.white;
}

 

실행 모습 

728x90