ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 이벤트 완벽하기 이해하기 2 - 델리게이트
    Unity, C#/Event 2019. 2. 18. 22:53

    델리게이트에 대해서 정리해 보았습니다.

    C#의 내용이지만 유니티 이벤트와 관계가 있어서

    Unity 카테고리에 넣어 두었습니다.

    실무에서 많이 사용되는 부분이라 이번 기회에 확실하게 이해하고 넘어가겠습니다.

    설명중에 틀린 부분이 있으면 댓글로 알려주시면 바로 수정하겠습니다.

     

     

    델리게이트 : 대행하다.


    어떤 함수를 목록(리스트)에 추가해 놓으면 델리게이트가 그 함수를 대신 실행해 줍니다. 

    목록(리스트)에는 그 함수를 가리키는 포인터 변수가 저장이 됩니다.


    * 계산기 만들기 *

     

    델리게이트를 사용하지 않을 때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Caculator : MonoBehaviour {
     
        public float Sum(float a, float b)
        {
            Debug.Log(a + b);
            return a + b;
        }
     
        public float Subtract(float a, float b)
        {
            Debug.Log(a - b);
            return a - b;
        }
     
        public float Mulitply(float a, float b)
        {
            Debug.Log(a * b);
            return a * b;
        }
     
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                Sum(110);
                Subtract(110);
                Mulitply(110);
            }
        }
        
    }
    cs

     

    스페이스 키를 누를때마다 Sum / Subtract / Multiply 함수를 실행합니다. 

    인자값이 정해져 있고, 다른 값을 계산하고 싶을때마다 Update() 함수의 내용을 바꾸어야 합니다.

     

     

    델리게이트를 사용할 때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public class Calculator : MonoBehaviour {
     
        // delegate 의 원형(int형,float형 같은)을 만듭니다. 
        // Caculate 형은 인자로 (float a, float b)를 받고, 리턴값이 float 인 함수를 받습니다.
        // 여기에서 Caculate 는 int a; 에서 int 에 해당한다고 볼 수 있습니다. 
        delegate float Calculate(float a, float b);
     
        Calculate onCalculate;
     
        void Start()
        {
            // Sum() 이라고 하면 Sum()을 호출한다는 뜻입니다. 
            // 여기선 Sum을 onCalculate에 등록하는 부분이므로 ()를 추가하지 않습니다.
            // onCalculate 가 Sum을 대행해서 실행해 줍니다.
            // 아래와 같이 동일한 타입의 여러 함수를 등록하거나 뺄 수 있습니다.
            onCalculate = Sum;
            onCalculate += Subtract;
            onCalculate += Mulitply;
            onCalculate -= Subtract;
        }
     
        public float Sum(float a, float b)
        {
            Debug.Log(a + b);
            return a + b;
        }
     
        public float Subtract(float a, float b)
        {
            Debug.Log(a - b);
            return a - b;
        }
     
        public float Mulitply(float a, float b)
        {
            Debug.Log(a * b);
            return a * b;
        }
     
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                // onCalculate에 등록된 함수 중에 
                // 마지막으로 등록된 함수의 계산된 결과값만 출력됩니다.
                float result = onCalculate(110);
                Debug.Log("결과값 = " + result);
            }
        }
        
    }
     
    cs
     
    onCalculate 라는 델리게이트 형을 만들어서 Start()에서 실행하기 원하는 함수를 등록해 둡니다.
    스페이스 키를 누르면 Update()에서 onCalculate를 실행합니다.
    계산기는 어떤 함수를 실행할지 알지 못합니다. 
     
    아직까진 가독성이 좀 더 좋아진 것 빼곤 어떤 좋은 점이 있는지 모르겠습니다. 
    혹시 아시는 분 좀 알려주세요. 
     
     

    회사 코드에 활용된 부분을 정리해 보겠습니다.

    사용예)

     1. 어떤 이벤트가 발생할 때 서버에서 클라이언트로 패킷을 보내줍니다.

    2. 패킷을 받은 클라이언트는 이 패킷이 적용되는 변수를 갱신해 줍니다. (변수가 있는 클래스는 싱글톤입니다.)

    3. 변수가 갱신되면 해당 변수에 영향을 받는 게임내에 요소에 모두 적용이 되어야 합니다. 

    4. 델리게이트를 사용하지 않으면 변수가 있는 클래스에서 변수의 영향을 받는 클래스들을 모두 알아야 합니다.    

        이게 단순한 구조면 싱글톤에서 각 클래스의 함수를 호출하면 되는데 구조가 복잡해지면 쉽지가 않습니다.    

        게임 씬에 따라서 영향받는 클래스가 현재 씬에 있을수도 있고, 없을수도 있으니깐요.

    5. 그래서 싱글톤에 델리게이트를 만들고, 변수의 영향을 받는 클래스에서 싱글톤에 만든 델리게이트에 함수를 추가합니다.   

        변수가 있는 클래스는 싱글톤이므로 어디서든 접근 가능하지요.    

        그리고 씬이 바뀔 때 변수의 영향을 받는 클래스가 파괴되면 그때 델리게이트에서 클래스의 함수를 제거해 줍니다.

     

    다음에 좀 더 쉽게 정리해 놓겠습니다. 

     

     
     

    댓글

Designed by Tistory.