본문 바로가기

유니티

간단 Action / Func 예제

간단하게 ActionFunc에 대해서 알아보자!

 

먼저 Action과 Func를 알기 위해서는 (델리게이트)Delegate를 알아야할 것이다.

델리게이트는 한마디로 대리자이다. (즉. 대신 일을 해주는 녀석이라고 할 수 있다.)

 

대리자는 구독과 구독취소를 통해서 이벤트를 처리할지 말지 결정한다.

Action

반환값이 없는 메서드를 등록할 수 있는 델리게이트이다.

 

Func

반환값이 있는 메서드를 등록할 수 있는 델리게이트이다.

 

이벤트를 처리할 때 많이 쓰이는 함수이다.

 

공통 주의 사항

1. 액션이나 펑크를 사용할 때 만약 함수를 하나도 넣지 않고 실행하면 어떻게 될까?

바로 오류가 나게 된다.

2. using System; 을 선언해야 사용할 수 있다.

 

 

그러면 유니티에서는 어떠한 곳에 사용할까?

하나의 예시로 사용자에게 보이는 UI 이벤트를 처리할 것 이다.

어떠한 행동을 했을 때 그것을 바로 UI 이벤트를 처리해줘야한다.

 

*이렇게 봤을 땐 어떻게 사용해야할지 감이 안 잡힐 것 같다. 그래서 사용예제를 만들어봤다.

 

using UnityEngine;
using System;
public class ActionFunc : MonoBehaviour
{
    public Action<int> Action_IntLog;
    public Action Action_VoidLog;

    public Func<int> Func_IntLog;

    private int index;

    private void Start()
    {
        Action_IntLog += Debug_Action;
        Action_VoidLog += Debug_Action;
        Func_IntLog += Debug_Func;

        index = 0;
    }

    private void Debug_Action(int count)
    {
        Debug.Log("action : " + count);
    }
    private void Debug_Action()
    {
        Debug.Log("action : " + index);
    }
    private int Debug_Func()
    {
        return index;
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Action_IntLog.Invoke(index++);
        }else if (Input.GetMouseButtonDown(1))
        {
            Action_VoidLog.Invoke();
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Func_IntLog.Invoke();
        }
    }
}

 

이 예제로 Action<int> 를 설명해보겠다. 

Action<int> Action_IntLog를 선언하여

Debug_Action(int count) int를 매개변수로 받는 이 함수를 구독해주었다.

 

이제 마우스의 왼쪽 버튼을 눌렀을 때 Action_IntLog을 실행을한다.

 Action_IntLog.Invoke(index++); 를 통해서 실행을 한다.

그러면 멤버변수로 선언되어있던 int형 변수 index는 이벤트를 통해서 값이 올라갈 것이다.

 

간단하게 작성해봤지만 이벤트를 처리하는 많은 부분에서 유용하게 사용될 것이라서 필수적으로 알아야한다. 

 

delegate, action, func은 대리자라고 부르는 것으로 메소드에 대한 참조 변수를 만들기 위해 존재합니다. 이중 delegate가 가장 기본적인 형태입니다.
action과 func은 C# 버전이 올라가면서 편의성을 위해 프로그래머가 일일이 delegate를 정의하지 않아도되게 C# 내부적으로 정의하고 있는 대리자로 action은 인자만 존재하는 delegate, func은 인자와 결과 값이 모두 존재하는 delegate입니다.
저는 delegate를 직접 정의하여 delegate가 어떤 목적으로 존재하는지 명시하는 것을 선호할뿐 action이나 func을 사용해도 상관없습니다. 

event는 좀 다른데요, 우리가 event 키워드를 붙이지 않고 그냥 Action<float> onAction 이런식으로 변수를 선언할 시에, 다른 클래스에서 example.onAction.Invoke(); 이런식으로 Action을 실행할 수 있게 됩니다. 하지만 event Action<float> onAction와 같이 event를 붙일 경우 대리자를 오직 변수를 선언한 클래스 내부에서만 쓸 수 있게되어 다른 클래스에서 example.onAction.Invoke();  이런식으로 코드를 작성하면 에러를 띄우게 됩니다. 즉, event는 '클래스 내부에서만 실행할 대리자니 다른 곳에서 사용하지 못하게 하라'라고 컴파일러에 명시적으로 알려주는 기능을 합니다.

728x90

'유니티' 카테고리의 다른 글

유니티 - Mirror 셋팅 및 Attribute 간단 설명  (0) 2024.06.09
유니티 최적화 - Coroutine  (0) 2024.05.11
유니티 최적화 - Engine  (0) 2024.05.10
유니티 최적화 - Garbage Collection  (0) 2024.05.09
UniTask  (0) 2024.04.30