본문 바로가기

프로그래밍/Unity

UnityEvent vs C# Event : 무엇을 쓸까?

 Unity를 사용하면서, UnityEvent와 C# Event 중 어떤 것을 사용해야할지에 대한 고민이 들었다.

 평소에는 보통 C# Native Event를 주로 사용했다. 이유는 크지 않았다.

 UnityEvent, UnityAction 보단 System.Action이 더 익숙하고 편했기 때문이다.

 

 UnityEvent가 C# Event에 비해 가지고 있는 장점은 Serialize 된 이벤트 객체라서 Editor에서 바인딩이 된다는 거 정도로 알고 있었다. 근데 그 마저도 스크립팅의 AddListener() 메서드로는 Editor에서 확인이 안되기 때문에, 스크립팅을 통해 주로 바인딩하는 나에게는 전혀 이점이 없었다.

 

 외부 라이브러리 중에서 UnityEvent를 사용하는 것들이 있다보니, 코드에 UnityEvent와 C# Event가 혼재되는 상황이 발생했다. 동작하는데는 아무런 지장이 없지만 한 클래스에 UnityEvent와 C# Event가 동시에 있는 꼴을 보니, 한 가지로 통일을 시키면 보기 이쁘겠다라는 생각이 들어 그 차이점을 찾아보았다.

 

원문 출처 : https://jacksondunstan.com/articles/3335

 

JacksonDunstan.com

Unity programmers have their choice of two kinds of events. We could use the built-in C# event keyword or Unity’s UnityEvent classes. Which is faster? Which one creates more garbage? Today’s article finds out! First off, let’s look at how you use C# events

jacksondunstan.com

유니티에서 지원하는 UnityEvent와 C#에서 지원하는 Event의 성능 차이에 관한 글이다.

2016년초의 글이라 지금은 또 어떻게 바뀌었을지는 모르겠지만, 여기저기 링크도 많이 되어있는 믿을 만한 글인 것 같다.

 

결론부터 세줄 요약 하면,

1. Event Listener가 2개 이상인 경우, UnityEvent가 C# Event에 비해 메모리를 덜 Allocation한다. (1개인 경우 그 반대)

2. Event Dispatch의 경우 UnityEvent맨 처음 Dispatch할 때 가비지를 발생시킨다. C# Event는 가비지가 발생하지 않는다.

3. UnityEvent는 C# Event에 비해 최소 두 배 느리고, worst case의 경우 40배까지 느렸다.

 

 위의 내용을 나름대로 해석해보자면, Editor를 이용해서 Event 관리를 할 경우가 있거나 한 개의 Event에 여러 Listener가 붙어있는 경우는 UnityEvent, 그 외에는 C# Event를 사용하면 될 것 같다.

 

 개인적인 바람으로는 UnityEvent가 뭔가 더 좋거나 같은 성능을 보여줘서 모두 UnityEvent로 바꾸면 깔끔하지 않을까 싶었는데. 아무래도 UnityEvent가 들어간 외부 라이브러리를 한 번 래핑을 한다거나 하는 것이 좋겠다.