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); // 원래는 선택 시 꺼지는 것이 팝업창의 역할이 맞음
}
}
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;
}
실행 모습
'공부 기록 > 유니티 Unity' 카테고리의 다른 글
[Unity/TIL] 유니티 숙련 과정에서 알게 된 것들 (0) | 2025.03.05 |
---|---|
[Unity/TIL] 3D 환경 조성하기 (스카이박스 & 낮과 밤 구현하기) (0) | 2025.03.04 |
[Unity/TIL] 특정 위치에 다른 오브젝트가 있는지 감지하는 방법 (3) | 2025.02.26 |
[Unity/TIL] DOTween으로 UI 애니메이션 만들기 (0) | 2025.02.25 |
[Unity/TIL] 2D TopDown Shooting 게임 제작 (2) | 2025.02.18 |