-
유니티 이벤트 완벽하게 이해하기 4 - 액션과 람다 함수Unity, C#/Event 2019. 3. 5. 18:44
액션과 람다 함수에 대해 이야기 하고자 합니다.실무에 많이 사용하므로 알아두는게 좋을 것 같습니다.
(진실한 세상을 꿈꾸며 : http://theeye.pe.kr/archives/2725)
액션
유니티에서 쓰기 쉽도록 미리 만들어진 델리게이트예를들어 코딩을 하다보면 "리턴값이 void 이고 입력값이 없는 함수형"을 델리게이트로 사용할 일이 많습니다.그래서 처음부터 이런 타입을 Using System 내부에 만들어 놓았습니다. 이것을 Action이라고 합니다. 즉 단순히 델리게이트를 편하게 사용하기 위한 단축키 라고 생각하시면 되겠네요.
Action : 입력값이 없고, 리턴값이 없는 델리게이트 타입
아래에 간단한 예제를 보겠습니다.12345678910111213141516171819202122232425262728293031323334353637using 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 가 있습니다. 메세지를 받으면 해당 사람들에게 전달하는 역할을 합니다.12345678910111213141516171819202122232425262728293031323334353637using 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"); }
'Unity, C# > Event' 카테고리의 다른 글
유니티 이벤트 완벽하게 이해하기 3 - 이벤트 (2) 2019.02.19 유니티 이벤트 완벽하기 이해하기 2 - 델리게이트 (0) 2019.02.18 유니티 이벤트 완벽하게 이해하기 1 (0) 2019.02.18