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;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
onSend("Angliss");
}
}
void SendMail(string reciever)
{
Debug.Log("Mail sent to: " + reciever);
}
void SendMoney(string reciever)
{
Debug.Log("Money sent to: " + reciever);
}
}
메시지를 대행해 주는 우체부 게임오브젝트를 만든다고 가정해보겠습니다.
위 스크립트는 onSend 델리게이트에 메시지를 출력하는 함수를 등록하고 Space를 입력하면 등록된 메시지를 출력하는 스크립트입니다.
그런데 메신저가 실시간으로 스크립트에 없는 함수를 받아서 도중에 전달할 수는 없을까요?
가능합니다. 그것이 람다입니다.
void Start()
{
onSend += man => Debug.Log("Assainate " + man);
}
람다 함수는 이름이 없는 함수를 뜻합니다. 위에 작성된 코드는 함수이기도 하고 오브젝트이기도 합니다. man 이라는 입력을 받아서 어떻게 사용하는지 만든 것입니다.
람다 함수는 오브젝트처럼 주고 받을 수 있고 변수에 저장할 수 있습니다. 즉석으로 함수를 만들어서 저장할 수 있습니다.
지금은 축약된 버전으로 작성하였는데 man 앞에 타입은 C# 컴파일러가 람다 표현식을 사용할 때는 알아서 처리해줍니다. 하지만 사용하는 에디터에 따라서 안될수도 있습니다.
=> 화살표 연산자는 입력이 들어와서 화살표 방향으로 간다고 이해하면 됩니다.
void Start()
{
onSend += (string man) => {
Debug.Log("Assainate " + man);
};
}
위 람다 식은 축약되지 않은 경우입니다. 보기에도 함수처럼 보이지요?
입력에 타입을 명시할 수 있고 함수처럼 중괄호가 들어갑니다. 중괄호 안에서는 세미클론으로 처리를 나누어 더 많은 내용을 작성할 수도 있습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Messenger : MonoBehaviour
{
public delegate void Send(string reciever);
Send onSend;
private void Start() {
onSend += SendMail;
onSend += SendMoney;
onSend += (string man) => {
Debug.Log("Assainate " + man);
Debug.Log("Hide Body");
};
}
private void Update() {
if(Input.GetKeyDown(KeyCode.Space))
{
onSend("Jinseok");
}
}
void SendMail(string reciever)
{
Debug.Log("Mail sent to: " + reciever);
}
void SendMoney(string reciever)
{
Debug.Log("Money sent to: " + reciever);
}
}
Start 함수에서 람다 식으로 함수의 이름을 선언하지 않고 함수 기능을 하는 코드를 작성하였습니다.