using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Worker : MonoBehaviour
{
delegate void Work();
Work work;
void MoveBricks()
{
Debug.Log("벽돌을 옮겼다.");
}
void DigIn()
{
Debug.Log("땅을 팠다.");
}
private void Start() {
work += MoveBricks;
work += DigIn;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
work();
}
}
}
델리게이트는 선언할때 데이터 타입과 입력받는 매개변수를 지정할 수 있습니다. 물론 함수를 등록할 때 타입이 같아야 델리게이트에 등록할 수 있습니다.
위와 같은 스크립트가 있고 위 스크립트는 벽돌을 옮기는 기능과 땅을 파는 기능이 있습니다. 게임이 시작되면 Start 함수에 의해 두 함수를 델리게이트 work에 등록했습니다. Update 함수를 통해 Space를 입력하면 work를 호출합니다.

Space를 입력하면 등록한 두 함수를 정상적으로 호출합니다.
그런데 리턴 타입이 void고 매개변수가 없는 함수는 많이 작성하게 됩니다. 마찬가지로 타입이 같은 델리게이트도 많이 작성하게 되죠.
그래서 C# 개발자들은 리턴 타입이 void고 매개변수가 없는 델리게이트를 C# 내부에 선언해 놓았습니다.
그것이 Action 함수입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Action 함수를 사용하기 위해
using System;
public class Worker : MonoBehaviour
{
//delegate void Work();
//Work work;
Action work;
void MoveBricks()
{
Debug.Log("벽돌을 옮겼다.");
}
void DigIn()
{
Debug.Log("땅을 팠다.");
}
private void Start() {
work += MoveBricks;
work += DigIn;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
work();
}
}
}
굳이 번거롭게 델리게이트를 선언하지 않아도 Action 타입을 사용해 쉽게 사용할 수 있습니다.
결과는 바꾸기 전 스크립트와 동일합니다.