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
public class VoidEvent : UnityEvent
{
}
public class IntEvent : UnityEvent<int>
{
}
private VoidEvent _voidEvent;
private IntEvent _intEvent;
private void Start()
{
// Construct
_voidEvent = new VoidEvent();
_intEvent = new IntEvent();
// Re1gister (이게 왜 금칙어임???)
_voidEvent.AddListener(PrintHelloWorld);
_intEvent.AddListener(PrintNumber);
// Invoke
_voidEvent.Invoke();
_intEvent.Invoke(8);
}
public void PrintHelloWorld()
{
print("Hello World!");
}
public void PrintNumber(int n)
{
print(n);
}
cs



일반적인 UnityEvent 의 사용은 이런 식이다

이벤트의 입력 인자에 맞는 UnityAction을 등록하고 호출할 수 있음


1
2
3
// R123egister
_voidEvent.AddListener(PrintNumber);
_intEvent.AddListener(PrintHelloWorld);
cs

위처럼 입력 인자가 맞지 않으면 컴파일 에러가 난다



근데 람다식을 이용하면 이런 에러를 피해갈 수 있음

1
2
3
4
// Regis1233ter
_voidEvent.AddListener(() => PrintNumber(64));
_intEvent.AddListener((x) => PrintHelloWorld());
cs



굳~



스크립트에서 여러 버튼 요소를 관리할 때 편리함.

예를 들면

for (int i = 0; i < 10; i++){

_myButtons[i].onClick.AddListener(() => OpenCharacterPanel(i));

}


수정) 위와 같이 하면 10개가 모두 OpenCharacterPanel(9)를 부름

for (int i = 0; i < 19; i++){

int index = i;

_myButtons[i].onClick.AddListener(() => OpenCharacterPanel(index));

}

처럼 써줘야 함

람다식의 변수 캡쳐 문제라는데 정확히는 몰?몰


이런 코드로 10개의 버튼을 누를 때 각각 다른 캐릭터 창이 나타나게 한다던가

물론 이런 식의 이용은 등록 시 입력한 값을 수정할 수 없지만...


아니면 어떤 이벤트에 등록하고 싶은데 입력 인자가 안 맞을 때 이용해도 좋고

암튼 알아놔서 손해볼 건 없을듯