2 minute read

Deligate의 개념


델리게이트란 함수를 변수처럼 사용할 수 있는것 입니다.
자세한 설명은 ->C#-Delegate

유니티에서 델리게이트를 사용하는 방법에 관하여, 집중적으로 설명하고자 합니다.
유니티에서 델리게이트를 사용하는데에는 2가지가 있으며, 여기서 델리게이트를 더 편하게 사용가능한 기능은 3가지가 있습니다.

유니티에서 델리게이트 사용방법

  1. C#과 동일하게 델리게이트를 사용
  2. UnityAction

더 편하게 사용가능한 기능

  1. Anonymous method
  2. Lambda
  3. Action과 Func

Anonymous method(익명 또는 이름없는 Method)

Method의 몸체(내용)만 있는 Method를 말하며, 이 익명의 Method를 델리게이트에 사용할 수 있습니다.
단순히 Method명 대신 아래와 같이 delegate키워드와 함께 익명 Method의 형태를 넣으면 됩니다.

delegate(매개변수) { 내용; };

Lambda(람다식)

상기의 익명의 Method 보다 간단하게 람다식으로도 가능하며 아래와 같이 사용할 수 있습니다.
( ()=> 부분 입니다.)

test_delegate _test = (x, y) => x + y;


Action과 Func

Action과Func는 유니티에서 미리 정의된 델리게이트 타입으로 델맄게이트를 정의하지 않고 바로 델리게이트 변수를 만들 수 있습니다.
이를 사용하기 위해서는 System네임스페이스를 사용해야 합니다.
Action : 반환값이 없는 델리게이트 Func : 반환값이 있느 델리게이트

Action을 이용한 방법

 Action _testAction = ShowLog;
 _testAction();


Func를 이용한 방법

Func의 경우 인수와 반환 타입 모두 제네릭 표시를 해야 되기 때문에 순서에 맞게 적는것이 중요합니다.
<인수1, 반환타입>처럼 반환타입을 마지막에 적어야 됩니다.

Func<int, string> _testFunc = AddNumber;
Debug.Log(_testFunc(10));


사용 방법


미리 정의된 Method를 전달하는 델리게이트

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestDelegate : MonoBehaviour
{
    delegate void delegateTest();
    delegateTest _delegateTest;

    // Start is called before the first frame update
    void Start()
    {
        //_delegateTest = ShowText;
        _delegateTest = ShowLog;
        _delegateTest();
    }

    void ShowLog()
    {
        Debug.LogError("Delegate Test Log");
    }
}

Anonymous method(익명 또는 이름없는 Method)

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestDelegate : MonoBehaviour
{
    delegate void delegateTest();
    // Start is called before the first frame update
    void Start()
    {
        delegateTest _delegateTest = delegate ()
        {
            Debug.Log("Delegate Test Log");;
        };
        _delegateTest();
    }
}

Lambda(람다식)

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestDelegate : MonoBehaviour
{
    delegate void delegateTest();
    delegateTest _delegateTest;

    // Start is called before the first frame update
    void Start()
    {
        //_delegateTest = ShowText;
        _delegateTest = () => Debug.Log("Delegate Test Log");
        _delegateTest();
    }
}

Action과 Func

Action

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestDelegate : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Action _testAction = ShowLog;
        _testAction();
    }

    void ShowLog()
    {
        Debug.Log("Action Test Log");
    }
}

Action 에서 람다식 이용

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestDelegate : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Action _testAction = () => Debug.Log("Action Test Log");
        _testAction();
    }
}

Func

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestDelegate : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Func<int, string> _testFunc = AddNumber;
        Debug.Log(_testFunc(10));
    }

    string AddNumber(int _number)
    {
        return $"출력 : {_number}";
    }
}


Top