공부/Unity

[Unity] Unity event와 C# event의 차이점

굴러다니다니 2023. 5. 1. 13:53
728x90

C# event delegate vs Unity event

Unity Event?

어떤 이벤트가 발생되면 그 이벤트에 등록해둔 기능이 발동

     → 이벤트 발생시키는 쪽과 이벤트를 등록해둔 쪽 서로 관심이 없다 (언제 어떻게 등록, 실행이 되는지 연관이 없다)

 

- 등록되어있는 함수들은 언제 / 어떻게 발동될 지 서로 무관심

- 코드가 간결해지는 장점 (스파게티 회피)

- 클래스 의존도를 낮출 수 있다.

     → 두 오브젝트가 서로 심하게 엮임 : 커플링, 이것이 심해지면 한 오브젝트가 없어졌을 때 다른 오브젝트가 영향을 많이 받음

- Monobeheaviour을 상속받는 모든 클래스에서 사용 가능, UnityEvent 변수를 선언하면 인스펙터에 표시되며 영구적 콜백을 추가 가능

(영구적 콜백: 인스펙터에서 등록해준 콜백, 런타임에서는 수정이 불가하다), 스크립트 상에서 UnityEvent에 콜백을 등록한다면 이는 비영구적 콜백으로 런타임중에 수정이 가능하다

 


유니티 Event vs C# Event

유니티쪽이 Serialize된 이벤트 객체라 Editor에서 바인딩이 된다.

Event listener가 2개 이상인 경우, UnityEvent가 C# Event에 비해 메모리를 덜 Allocate, 1개라면 반대

Event Dispatch의 경우 Unity는 맨 처음 Dispatch할 때 가비지를 발생, C#은 가비지 발생X

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

 

* 사진의 오른쪽 아래 링크에서 자세한 설명이 있다

 

* 요약

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

 

Publisher: 발행자 / Subscriber: 구독자

 

등록: 뭐시기.AddListener(메소드 이름);

제거: 뭐시기.RemoveAllListeners(); / RemoveListener(메소드 이름);

호출: UnityEvent.Invoke(); 등록된 모든 리스너 호출

Event는 할당 연산 = 이 아니라 추가 연산 += 작업으로 해야 이전에 입력된 값들이 안없어지고 순차적으로 작업된다.

 

간단한 예제

https://angliss.cc/unityevent/

성능 차이

https://forum.unity.com/threads/whats-the-difference-between-unityaction-and-c-actions.1041184/

728x90