Priv's Blog
Unity Event vs Delegate Event 본문
1. Unity Event
Unity Event는 Unity 엔진 차원에서 제공하는 이벤트 기능으로, 에디터 상에서 작업이 이루어지는 디자인 단계에서 게임 오브젝트 사이의 함수 호출을 후크할 수 있도록 만들어져 있습니다.
별도의 스크립트 코드를 작성하지 않아도 마우스 클릭 몇 번으로도 간단하게 기능을 구현할 수 있어서 디자인 단계에서 활용하기에 적합합니다.
물론, C# 스크립트 작업을 할 때도 Unity Event를 다룰 수 있습니다.
UnityEvent 타입의 변수를 생성한 뒤, AddListener( ) 메서드로 이벤트 호출 시 반응할 리스너를 연결하고, Invoke( ) 메서드로 이벤트를 발동하는 형식입니다.
다만 Unity Event를 에디터 상에서 직접 조작할 수 있다는 장점을 살리기 위해서는 매개변수를 1개 이상 사용할 수 없으며, 직렬화가 가능한 타입만 적용해야 한다는 제한 사항이 있습니다.
2. C# Events
사실 C#의 Event의 기능들은 Unity Event로도 구현이 가능합니다.
그럼에도 C# Event 기능을 사용하는 이유는 Unity Event와 달리 이벤트를 호출할 수 있는 제약 조건이 좀 더 까다롭기 때문입니다.
C#의 Event는 해당 이벤트를 선언한 클래스에서만 invoke가 가능합니다.
다른 클래스는 단순히 Event에 리스너를 추가하거나 삭제만 가능하죠.
이 때문에 다른 클래스나 프로그래머의 개입에서 코드의 신뢰성을 좀 더 보장할 수 있습니다.
또한 C# Event는 Unity Event와 달리 디자인 단계가 아니라 런 타임 단계에서 메서드를 후크하기 때문에 에디터 상에서의 개입이 어렵습니다.
추가로 C# Event는 Unity Event와 달리 Unity 내에서 Scene이 다시 로드되거나 다른 Scene으로 넘어가게 되면 설정해 둔 참조가 풀려버립니다.
이 때문에 코드 구조를 설계할 때, 초기화 작업을 적절한 순간에 수행할 수 있도록 해야 합니다.
3. 그래서 뭐가 더 좋은가?
사실 용도가 다르기 때문에 정확히는 모릅니다.
둘 다 거의 기능은 유사하지만, 서로 특징이나 장단점, 용도가 조금씩 달라서 1:1 비교는 힘들다고 봅니다.
디자인 단계에서 후크 작업을 미리 해놓는 게 작업에 더 유리하다고 판단되면 Unity Event를 쓰는 게 더 좋겠죠.
반대로 코드 상에서의 신뢰성을 확보하는 게 중요하다면 C# Event가 더 유리할 것이고요.
C# Event는 Scene을 넘나들게 될 때 참조가 풀린다고 언급했지만, 사실 이것도 초기화 작업을 수행하는 시점을 잘 선정해서 배치하면 되기 때문에 아키텍처를 잘 짜면 큰 문제가 되지 않습니다.
(그런데도 굳이 언급한 것은 이런 특징을 모르고 코드를 짜다가 생긴 에러를 온갖 고생 끝에 겨우 파악해 낸 경험에 대한 원망 아닌 원망도 있습니다)
개인적으로는 C# Event와 Delegate를 함께 사용해서 += 또는 -= 를 사용해 체인으로 묶는 문법을 먼저 익혔기 때문에 오히려 Unity Event가 낯설었기에 C# Event를 좀 더 많이 사용해 봤으나, 현재는 상황에 맞게 섞어서 사용하는 중입니다.
수고하셨습니다!
'Dev. Study Note > Unity' 카테고리의 다른 글
C# EventHandler 중복 호출 방지법 (0) | 2024.10.22 |
---|---|
움직임(물리)을 구현하자 (0) | 2024.10.15 |
SerializeField 속성과 변수 초기화, Null 참조 에러 (0) | 2024.07.28 |
세션 간의 데이터 지속성 (JsonUtility & NewtownSoft Json) (0) | 2024.06.14 |
OOP의 다형성, Overloading과 Overriding 그리고 global:: (0) | 2024.05.13 |