2022. 2. 22. 17:04ㆍGame Development/Unity
Unity 공부를 하다가 MonoBehaviour 클래스에서 제공하는 "SendMessage()"와 "BroadcastMessage()" 기능을 봤다.
위 함수들을 이용하여, 게임 오브젝트에 붙은 모든 컴포넌트의 함수를 이름으로 실행할 수 있다고 한다. 일반적으로 클래스에 접근하기 위해선, 객체를 가리키는 참조 변수를 통해 해당 클래스의 멤버 변수와 함수에 접근하게 된다. 하지만, "SendMessage()"와 "BroadcastMessage()"는 실행할 함수의 이름만 알고 있다면 참조 과정을 거치지 않아도 된다.
SendMessage()
다음은 Unity API Documentation에 적혀있는 함수의 원형이다.
public void SendMessage(string methodName,
object value = null,
SendMessageOptions options = SendMessageOptions.RequireReceiver);
- methodName : 실행할 함수의 이름
- value : 실행할 함수가 매개변수가 필요하다면, 전달해줄 값
- options : 메세지를 보낼 방법에 대한 옵션
- RequireReceiver : SendMessage에 대한 수신자가 필요할 경우에 사용
- DontRequireReceiver : SendMessage에 대한 수신자가 필요하지 않을 경우에 사용
- methodName 이름을 가진 함수가 컴포넌트에 존재하지 않을 경우, 해당 컴포넌트를 무시하고 다음 컴포넌트로 이동해 methodName 이름을 가진 함수를 찾는다.
즉, SendMessage는 하나의 게임 오브젝트에 붙어있는 모든 컴포넌트에 걸쳐 지정된 함수를 찾아서 호출한다.
BroadcastMessage()
public void BroadcastMessage(string methodName,
object parameter = null,
SendMessageOptions options = SendMessageOptions.RequireReceiver);
기본적인 구성은 SendMessage와 같다. 그렇다면, 어떤 차이가 있느냐?
BroadcastMessage는 해당 게임 오브젝트의 자식 오브젝트까지도 함수를 찾는 과정을 진행한다.
즉, BroadcastMessage()를 통해 호출한 함수를 현재 게임 오브젝트 내의 컴포넌트들 사이에서 찾고, 그 다음 자식 오브젝트까지 찾아들어가면서 재귀적으로 계속 반복하는 것이다.
UI 같은 부분에서 사용하면 유용하지 않을까란 생각이 들긴 한다. (UI는 Canvas 밑에 여러 UI 오브젝트들을 달기 때문에)
주의할 점
SendMessage와 BroadcastMessage는 오브젝트 혹은 컴포넌트 간 통신을 수월하게 만들어 동기화하는 데 유용한 방식이다. 하지만, SendMessage와 BroadcastMessage는 모두 내부적으로 C#의 리플렉션(Reflection)이라는 기능에 의존한다.
문자열을 이용해 함수를 호출하면, 애플리케이션 프로그램은 실행 중에 스스로를 살펴보고 실행할 코드를 찾는 과정을 진행하게 되는데, 이 과정이 일반적인 함수 호출보다 무거운 연산을 필요로 한다.
특히, Update 이벤트나 다른 프레임 기반의 호출 안에서는 성능 저하를 상당하게 일으킬 수도 있다.
따라서, 필요할 때만 사용 빈도를 최소화하여 사용하도록 하는 것이 좋아 보인다.
- 이 글은 <유니티 C# 스크립팅 마스터하기> 책을 바탕으로 공부한 글입니다.
'Game Development > Unity' 카테고리의 다른 글
[Unity] 시각적 디버깅에 용이한 기즈모(Gizmos) (0) | 2022.03.11 |
---|---|
[Unity] 전처리기 플래그 (Preprocessor Flag)를 이용한 조건 컴파일 코드 작성하기 (0) | 2022.03.08 |
[Unity] "Universal RP Light 2D"를 스크립트 제어하기 (0) | 2022.02.20 |
[Unity] 일방향 충돌, 측면 마찰 및 반발력을 설정할 수 있는 Platform Effector 2D (0) | 2022.02.19 |
[Unity] 빌트인 파티클 시스템(Built-in Particle System) : 메인 모듈(Main Module) (0) | 2022.02.17 |