[TIL] Unity - 메시지와 브로드캐스팅

MINO·2024년 9월 26일

2024-09-26


BroadCasting

컴포넌트 구조에서 전체 방송 을 이용해 컴포넌트의 특정 기능을 간접적으로 실행할 수 있다.

이 때의 전체 방송Broadcasting 이라고 부른다.


MonoBehaviour

유니티의 모든 컴포넌트의 기반이 되는 MonoBehaviour 클래스이다.

MonoBehaviour 를 상속해서 만들어진 컴포넌트는 유니티의 제어를 받게 되고,
이 제어는 Unity 의 Message 를 통해 이루어진다.


메시지 기반 방식

유니티는 발동시키고 싶은 기능의 이름을 담아 메시지를 전송시키고,
메시지를 받은 오브젝트가 메시지에 명시된 기능을 가지고 있으면
해당 기능을 실행한다.

  • 메시지를 보내는 쪽은 누가 받게 될지 신경쓰지 않는다.
  • 메시지를 받은 쪽은 누가 보냈는지 신경쓰지 않는다.
  • 메시지를 받았을 때 명시된 기능을 가지고 있다면 실행,
    그렇지 않다면 무시

이처럼 무차별적으로 여러 오브젝트에 동시에 뿌리는 방법을 브로드 캐스팅 이라고 한다.

이러한 방법을 통해 특정 오브젝트를 직접 가리키지 않고 (찾아낼 필요 없이)
원하는 기능을 수행하게 할 수 있다.


유니티 이벤트 메서드

메시지와 브로드 캐스팅을 통해
유니티의 생명 주기 함수인 Start, Update 등의 유니티 이벤트 메서드(MonoBehaviour 를 상속 받음) 가 동작하는 원리를 이해할 수 있다.


Ex) Start : 게임 오브젝트가 활성화될 때, 유니티가 해당 게임 오브젝트에 Start 라고 적힌 메시지를 브로드캐스팅한다.
- Start 메서드를 수동으로 실행(호출)할 필요가 없다.


API 활용해보기

MonoBehaviour 에서 제공하는 메서드인
SendMessage( ), BroadcastMessage( ) 에 대해 알아보자.

SendMessage

하나의 게임 오브젝트에 붙어 있는 모든 컴포넌트 중 지정된 함수를 찾아 호출

public void SendMessage(string methodName,
	object value = null,
	SendMessageOptions options = SendMessageOptions.RequireReceiver);
  • methodName : 호출할 메서드 이름
  • value : 메서드에 매개 변수가 필요할 때, 전달해줄 값
  • options : 메세지 보내는 방법에 대한 옵션
    • RequireReceiver : SendMessage 의 수신자가 필요한 경우
    • DontRequireReceiver : 이름을 가진 메서드가 컴포넌트에 없을 경우, 다음 컴포넌트에서 탐색

BroadCastMessage

해당 게임 오브젝트의 자식 오브젝트까지도 메시지를 보내 해당 메서드를 찾아 호출

public void BroadcastMessage(string message,
		object parameter = null,
		SendMessageOptions options = SendMessageOptions.RequireReceiver);

장단점

장점

  • 다른 게임 오브젝트나 컴포넌트 간의 메시지를 간단하게 전달 가능
  • 객체 간의 의존성을 줄일 수 있어, 코드의 모듈화에 용이
  • 이벤트나 상태 변경을 기반으로 하는 로직을 구현할 때 유용
    - UI , InputSystem ...

단점

  • 내부적으로 C# 의 리플렉션(Reflection) 기능에 의존
    - 런타임 중에 객체의 이름, 멤버 등 객체의 모든 정보를 가져와 분석
  • 문자열을 통해 메서드를 호출하다보니, 일반적인 메서드 호출보다 무거운 연산을 필요로 한다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글