
: 여러 개의 매개변수를 넣을 수 있고 반환타입이 있는 Delegate
→ 마지막에 적은 타입이 반환타입
접근제한자 Func<매개변수1, 매개변수2, 반환타입> 변수명;
public Func<int, int, int> myFunc;
using System;
using UnityEngine;
public class StudyFunc : MonoBehaviour
{
public Func<int, int, int> myFunc;
void Start()
{
myFunc = AddMethod;
int result = myFunc.Invoke(10, 7);
Debug.Log(result);
}
private int AddMethod(int num1, int num2)
{
return num1 + num2;
}
}
Func는 델리게이트 체인 사용 ❌using System;
using UnityEngine;
public class StudyFunc : MonoBehaviour
{
public enum Buff { A, B, C }
public Buff buff;
public Buff currentBuff;
public float currentDmg;
// 접근제한자 Func<매개변수, 매개변수, 반환타입> 변수명
public Func<Buff, float, float> myFunc;
void Start()
{
myFunc?.Invoke(currentBuff, currentDmg);
}
private float CalculationDamage(Buff buff, float dmg)
{
int result = 0;
switch (buff)
{
case Buff.A:
result = 10;
break;
case Buff.B:
result = -20;
break;
case Buff.C:
result = 100;
break;
}
return dmg * result;
}
}
: 여러 개의 매개변수를 넣을 수 있고 반환타입이 없는 Delegate
Action 형식으로 제네릭 사용 가능
Action의 다양한 모습
using System;
using UnityEngine;
public class StudyAction : MonoBehaviour
{
public delegate void MyDelegate();
public MyDelegate myDelegate;
public Action action;
public delegate void MyDelegate2(string s);
public MyDelegate myDelegate2;
public Action<string> action2;
public Action<string, int, float, bool> action3;
}
커플링된 싱글톤
using System;
using UnityEngine;
public class ButtonManager : Singleton<ButtonManager>
{
public bool isSingleton = false;
private void StopMessage()
{
Debug.Log("긴급 정지 실행");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
isSingleton = true;
}
}
}
using UnityEngine;
public class ExternalClass : MonoBehaviour
{
void Update()
{
if (ButtonManager.Instance.isSingleton)
{
TimerView();
}
}
private void TimerView()
{
}
}
디커플링된 Action
using System;
using UnityEngine;
public class ButtonManager : MonoBehaviour
{
public static Action emergencyStopButton;
void Start()
{
emergencyStopButton += StopMessage;
}
private void StopMessage()
{
Debug.Log("긴급 정지 실행");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
emergencyStopButton?.Invoke();
}
}
}
using UnityEngine;
public class ExternalClass : MonoBehaviour
{
void Start()
{
ButtonManager.emergencyStopButton += TimerView;
}
private void TimerView()
{
}
}
: 한 개의 매개변수를 넣을 수 있고 반환타입이 bool인 Delegate
using System;
using UnityEngine;
public class StudyPredicate : MonoBehaviour
{
// 접근제한자 Predicate<매개변수> 변수명
public Predicate<int> myPredicate;
// 매개변수 1개만 사용 가능
public int level = 10;
void Start()
{
LevelCheck(level);
}
private void LevelCheck(int level)
{
if (level <= 10)
{
Debug.Log("초보자 사냥터 입장 가능");
}
else
{
Debug.Log("초보자 사냥터 입장 불가능");
}
}
}
using System;
using UnityEngine;
public class StudyPredicate : MonoBehaviour
{
public Predicate<int> myPredicate;
public int level = 10;
void Start()
{
myPredicate = n => n <= 10;
string msg = myPredicate(level) ? "초보자 사냥터 입장 가능" : "초보자 사냥터 입장 불가능";
Debug.Log(msg);
}
}
Action → “실행” (결과 없음)
Predicate → “조건 검사” (bool 반환)
Func → “계산” (결과 반환)
EventHandler → “이벤트” (sender + EventArgs 전달)