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/
'공부 > Unity' 카테고리의 다른 글
[Unity] 좀비 서바이벌 동그란 체력바 + 좀비 Ai (nav) + 피격판정 (0) | 2023.05.02 |
---|---|
[Unity] 좀비 서바이벌 Cinemachine, FK / IK, Scriptable Object를 활용한 총쏘기 (0) | 2023.05.01 |
[Unity] Renderer Pipe Line - HDRP와 URP와의 차이점 (0) | 2023.04.28 |
[Unity] 이동을 처리하는 Addforce와 Velocity의 차이점 / Dodge 게임 툴 만들기 (0) | 2023.04.26 |
[Unity] 커비 미완성 내용들 (디디디 대왕 AI 넣어주기) (1) | 2023.04.24 |