Unity

Unity - BroadCasting, SendMessage, BroadcastMessage

뽀또치즈맛 2025. 3. 16. 14:15

 

유니티의 BroadCasting

 
유니티는 게임 오브젝트에 브로드캐스팅라는 기능으로
실행을 관리한다.
 
브로드 캐스팅의 실행 방식 
모든 오브젝트에 같은 메시지를 보낸다.
해당 기능이 없다면 무시하고,
이후 해당 메시지를 실행할 수 있는 기능이 있다면
그 기능을 실행하도록 하는 것이다.
 
그렇다면, 이 브로드 캐스팅을 떠올렸을 때,
모든 오브젝트가 가지는 공통된 함수를 생각해보자.
 
대표적으로 Start와 Update가 떠오를 것이다.
 
Start는 처음 게임이 시작 되었을 때 한번 호출된다.
그렇다는 것은 Start관련 브로드 캐스팅은 단 한 번 실행된다는 것이다.
 
Update는 매 틱마다 브로드 캐스팅이 실행되는 것이다.
 
이런 브로드 캐스팅으로 관리된다는 것은
모든 오브젝트 들이 기본적으로 가지고 태어나는 함수들을 의미한다.
 

MonoBehaviour 와 BroadCasting

 
이러한 브로드 캐스팅의 영항을 받는 친구들은
MonoBehaviour 클래스의 상속을 받는다.
 
아래 사진은 유니티에서 제공하는
유니티 엔진 스크립트의 생명주기를 설명하는 사진이다.
유니티 엔진이 매 프레임 어떻게 동작하고
어떤 함수들을 순서대로 호출하는지를 보여주는 것이다.
 

 
우리가 작성한 클래스가
위의 생명주기에 맞춰서 동작하기 위해서는
그냥 클래스를 만들어낸다고 해서 동작하는 것은 아니다.
 
유니티에서 제공하는 프레임워크를 벗어나,
마음대로 클래스를 만들게 되었을 때
위 생명주기를 벗어나 독자적인 활동을 하게된다.
 
그렇게 되면,
유니티 엔진에서 제공하는 다양한 기능을 활용할 수 없을 뿐더러
안전성도 해치는 일이 된다.
 
하지만, 
MonoBehaviour 클래스를 상속받게 된다면
유니티 엔진 스크립트의 생명 주기와 결합이 된다.
위의 사진의 사이클 안에서 작동하게 되는 것이다.
 
즉, 사용자가 MonoBehaviour 클래스를 사용한다는 의미는
MonoBehaviour 클래스를 통해
유니티 엔진의 프레음워크를 강제하는 역할을 하는 것을 알 수 있다. 
 
MonoBehaviour 클래스를 상속받는다면
유니티 엔진 프레임워크를 강제받게 되므로
사용자는 유니티 엔진에서 안내하는 방식으로
클래스를 설계하고 구성해야 한다는 것이다.
 
어떻게 보면 제약적인 행동이지만,
사용자는 이를 통해 엔진의 구체적인 기능을 이해하지 않더라도
클래스를 설계할 수 있게된다.
 
MonoBehaviour 내부의 Start나, Update 등의 함수의
내부 구현 측면에서 정확하게 어떻게 동작하는지 이해할 필요 없이
어떠한 역할을 하는지만 이해한다면
사용자의 의도대로 작동할 수 있다.
 

MonoBehaviour 의 역할

1. C#으로 작성된 클래스와 에디터를 연결해준다.
2. 사용자에게 유니티 엔진의 프레임워크를 강제한다.
3. 엔진을 구체적으로 이해하지 못해도 사용할 수 있도록 도와준다.
 
 

SendMessage()와 BroadcastMessage()

 
MonoBehaviour 클래스에서 제공하는
SendMessage()와 BroadcastMessage()의 함수들을 이용하여
게임 오브젝트에 붙은 모든 컴포넌트의 함수를 이름으로 실행할 수 있다.
 
일반적으로 클래스에 접근하기 위해서는
객체를 가리키는 참조 변수를 통해
해당 클래스의 멤버 변수와 함수를 접근하게 된다.
 
SendMessage()와 BroadcastMessage()는
실행할 함수의 이름만 알고있다면
참조 과정을 거치지 않아도 된다.
 

주의할 점

 
SendMessage와 BroadcastMessage는
오브젝트 혹은 컴포넌트 간 통신을 수월하게 만들어 동기화하는 데 유용한 방식이다.
하지만, SendMessage와 BroadcastMessage는 모두 내부적으로
C# 리플렉션(Reflection)이라는 기능에 의존한다.
 
1) 문자열을 이용해 함수를 호출하면,
 
2) 애플리케이션 프로그램은 실행 중에 스스로를 살펴보고
 
3) 실행할 코드를 찾는 과정을 진행하게 되데,
 
주의) 이 과정이 일반적인 함수 호출보다 무거운 연산을 필요로 한다.
특히, Update 이벤트나 다른 프레임 기반의 호출 안에서는
성능 저하를 상당히 일으킬 수도 있다.
(= 당연하다, 모든 오브젝트에 메시지를 보내는 것이니깐!)
 
따라서, 필요할 때만 사용 빈도를 최소화하여 사용도록 하는 것이 좋다.
 

개인 견해

개인적으로 필자의 유니티의 
SendMessage와 BroadcastMessage는
 
안도로이드의
broadcast sender, broadcast receiver와 흡사하다고 느겼다.
 
안드로이드에서
broadcast sender는 메시지를 보내고
broadcast receiver는 메시지를 수신한다는 점에서
 
시스템이나 앱이 장치 충전이나 시스템 부팅 등
특정 이벤트가 발생하면 브로드캐스트를 보낸다는 점과
앱은 특정 메시지를 수신하도록 등록할 수 있다는 점에서 흡사하다고 느꼈다.