본문 바로가기

유니티 개발 정보/프로그래밍

New Unity Messaging System

메시징 시스템

이번 유니티 4.6에서, 새로운 UI시스템은 기존의 SendMessage를 대체하기위해 메시징 시스템을 사용한다. 
이 시스템은 순수하게 C#으로 만들어졌고, SendMessage를 사용하는데 있어 발생했던 문제들을 해결하는것을 목표로 하고 있다. 

이 시스템은 메시징 시스템으로부터 콜백을 받을 수 있다는 것을 나타내기 위해, MonoBehaviour에 커스텀 인터페이스를 사용하여 작동한다. 명시된 타켓 오브젝트의  콜백함수가 호출될 때, 해당 호출에 대한 특정 인터페이스가 구현된 모든 컴포넌트에 호출된다.

메시징 시스템은 게임 오브젝트의 계층구조에서 얼마나 멀던간에 커스텀 유저 데이터를 전달한다.
이는 반드시 특정 게임 오브젝트 또는 자식 그리고 부모에서 반드시 실행되어야 한다. 이뿐만 아니라, 메시징 프레임워크는 메시징 인터페이스를 구현한 게임오브젝트를 찾게 도와주는 헬퍼 함수도 제공하고 있다.
메시징 시스템은 제네릭하며, UI뿐만 아니라 일반적임 게임 코드를 작성하는데 사용될 수 있도록 설계 되었다.
추가적인 커스텀 메시징을 추가하는 것 또한 어렵지 않으며, UI 시스템이 이벤트를 처리하는데 사용하는 것과 동일한 프레임워크로 작동한다.


어떻게 커스텀 메시지를 작성해야 하는가?


커스텀 메시지를 정의하는 것은 생각보다 쉽다. 

UnityEngine.EventSystems 인터페이스안에는‘IEventSystemHandler’라고 불리는 인터페이스가 있다. 이를 상속받고있으면 메시징 시스템을 통해 이벤트를 받고 있는 대상이라고 생각하면 된다.


public interface ICustomMessageTarget : IEventSystemHandler
{
    // 메시징 시스템을 통해서 호출될 수 있는 함수들
    void Message1();
    void Message2();
}

인터페이스가 정의되었다면, Monobehavior에서 반드시 구현해야 한다. 이를 구현하게 되면 해당 객체에 대해서 메시지가 왔을 경우 해당 함수가 실행될 것이다.

public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
    public void Message1()
    {
        Debug.Log ("Message 1 received");
    }

    public void Message2()
    {
        Debug.Log ("Message 2 received");
    }
}

이제 메시지를 받을 수 있는 스크립트가 있으니, 메시지를 만들어 보자. 보통은 느슨하게 결합된 이벤트에 반응한다.
예를 들어, UI 시스템에서는 PointEnter와 PointerExit같은 이벤트 뿐만 아니라 사용자의 입력에 반응하여 다양한 이벤트가 발생할 수 있다.

메시지를 보내기 위해, Static Helper 클래스가 존재한다. 매개변수로 해당 메세지를 전달할 대상 객체와 유저의 데이터 그리고 타켓에 있는 특정 함수와 매칭하기 위한 Funtor를 가진다.

ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());

이 코드는 ICustomMessageTarget인터페이스를 구현한 대상 객체의 특정 컴포넌트에 있는 Message1 함수를 호출할 것이다.








참조

- 유니티 공식 Messaing System 설명서