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개의 버튼을 누를 때 각각 다른 캐릭터 창이 나타나게 한다던가
물론 이런 식의 이용은 등록 시 입력한 값을 수정할 수 없지만...
아니면 어떤 이벤트에 등록하고 싶은데 입력 인자가 안 맞을 때 이용해도 좋고
암튼 알아놔서 손해볼 건 없을듯
오~~~
대신 일케하면 RemoveListener 못한다는걸 염두해둬야함 Remove안할거면 상관없을듯 그리고 람다식에서 어떤 파라메터를 안쓸거면 _intEvent.AddListener(_ => PrintHelloWorld()); 이렇게 언더스코어를 변수명으로 사용하는게 컨벤션으로 알고잇음
오호