ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 이벤트 완벽하게 이해하기 4 - 액션과 람다 함수
    Unity, C#/Event 2019. 3. 5. 18:44

    액션과 람다 함수에 대해 이야기 하고자 합니다.실무에 많이 사용하므로 알아두는게 좋을 것 같습니다.

     

    (진실한 세상을 꿈꾸며 : http://theeye.pe.kr/archives/2725)

     

     

    액션
    유니티에서 쓰기 쉽도록 미리 만들어진 델리게이트예를들어 코딩을 하다보면 "리턴값이 void 이고 입력값이 없는 함수형"을 델리게이트로 사용할 일이 많습니다.그래서 처음부터 이런 타입을 Using System 내부에 만들어 놓았습니다. 이것을 Action이라고 합니다. 즉 단순히 델리게이트를 편하게 사용하기 위한 단축키 라고 생각하시면 되겠네요. 
    Action : 입력값이 없고, 리턴값이 없는 델리게이트 타입

    아래에 간단한 예제를 보겠습니다. 

    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
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
     
    public class ActionAndRamda : MonoBehaviour
    {
        // delegate void Action(); --> 이 부분이 using System 내부에 구현되어 있습니다.
        Action work;
     
        void Start ()
        {
            // MoveBricks() 라고 하면 함수가 실행되는 것이므로 MoveBricks 라고 적습니다.
            work += MoveBricks; 
            work += DigIn;
        }
     
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                work();
            }
        }
     
        void MoveBricks()
        {
            Debug.Log("벽돌을 옮겼다.");
        }
     
        void DigIn()
        {
            Debug.Log("땅을 팠다.");
        }
     
    }
    cs


    쉬운 예제이므로 별다른 설명은 생략하겠습니다.


    람다 함수(익명 함수)

    함수명이 없는 함수라고 생각하면 될 것 같습니다. 

    설명은 간단하니 바로 예제를 보겠습니다.
    Messager 가 있습니다. 메세지를 받으면 해당 사람들에게 전달하는 역할을 합니다. 

    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
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
     
    public class Messenger : MonoBehaviour
    {
        public delegate void Send(string reciever);
     
        Send onSend;
     
        void Start ()
        {
            onSend += SendMail;
            onSend += SendMoney;
     
            // 입력 => 함수내용
            onSend += man => Debug.Log("Assainate " + man);
        }
            
        void Update ()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                onSend("DaeUn");
            }        
        }
     
        void SendMail(string reciever)
        {
            Debug.Log("Mail sent to: " + reciever);
        }
     
        void SendMoney(string reciever)
        {
            Debug.Log("Money sent to: " + reciever);
        }
    }
    cs
    onSend += man => Debug.Log("Assainate " + man);
     
    위에 줄에서 
    man => Debug.Log("Assainate " + man);
    이 부분이 람다 함수입니다.
    왼쪽 man 이 입력이고 오른쪽이 함수 내용입니다. 
    man 의 타입을 정의하지 않아도 리턴값이 없고, 입력값이 string인 onSend에
    추가하는 것이므로 c# 컴파일러가 알아서 string이라고 인식해 줍니다.
    즉 onSend에 등록할 수 있는 이유도 람다 자체를 하나의 오브젝트로 인식하고 있기
    때문인것 같습니다. 

     

    위에 기술한 람다식을 기본 포맷으로 표현하면 아래와 같습니다.

     

    (string man) => { Debug.Log("Assainate " + man); Debug.Log("Hide Body"); }

     

    이렇게 됩니다. 

    만약 입력값이 없고 리턴값도 없다면 아래와 같이 쓰면 됩니다.

     

    () => { Debug.Log("Assainate "); Debug.Log("Hide Body"); }

     

     

     

     

    댓글

Designed by Tistory.