메시지 릴레이

릴레이 메시지 보내기는 RPC와 유사하지만, 타깃으로 네트워크 개체는 필요 없습니다. 메시지는 클라이언트로 바로 전달됩니다. RPC와 달리, object로 전송되는 인수는 하나만 보낼 수 있으므로, 몇 가지 인수를 보내고 싶다면 컨테이너 개체로 묶어야 합니다.

릴레이 메시지 보내기

릴레이 메시지를 보내는 메서드 그룹에는 두 가지가 있습니다.

  1. 방송

    이 메서드를 이용하면 메시지를 방 멤버 전원에게 동시에 보낼 수 있습니다.

    void SendRoomRelay(object messageToRelay, RoomRelayEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
    
    void SendRoomRelay(RoomRelayMessage message, RoomRelayEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
    

    이 오버로드로 메시지 자체뿐만 아니라 메시지를 보내는 방에도 ID를 지정할 수 있습니다.

    참고

    방 밖에서는 릴레이를 보낼 수 없습니다.

  2. 직접

    이 메서드로는 방 멤버 한 명에게만 메시지를 보낼 수 있습니다. 수신인을 지정할 때는 UID를 첫 인수로 전달해야 합니다.

    방 멤버의 UID를 확인하는 방법에는 몇 가지가 있습니다.

    1. 가장 쉬운 것은 해당 멤버에 속하는 게임 개체를 찾아 StrixReplicator 요소를 추출하고, 그 요소의 ownerUid 속성을 이용하는 것입니다.

    2. 누군가 RPC 또는 릴레이 메시지를 보내 온다면, RPC의 경우 StrixRpcContextsenderUid 속성을 이용하여 발송인의 UID를 추출할 수 있고, 릴레이 통보라면 GetFromUid() 메서드를 추출할 수 있습니다.

    3. StrixNetwork.instance.roomMembers 속성으로 방 멤버 전원에게 반복한 후 기준에 따라 필요한 멤버를 선택하면 됩니다.

    void SendRoomDirectRelay(UID to, object messageToRelay, RoomDirectRelayEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
    
    void SendRoomDirectRelay(RoomDirectRelayMessage message, RoomDirectRelayEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
    

    이 오버로드로 수신인의 ID와 메시지 자체뿐만 아니라 메시지를 보내는 방에도 ID를 지정할 수 있습니다.

    참고

    방 밖에서는 릴레이 메시지를 보낼 수 없습니다.

    참고

    UID는 인터페이스 타입입니다. == 연산자로는 두 UID를 비교할 수 없습니다.

릴레이 메시지 받기

수신인 측에서는 릴레이 메시지 알림 이벤트를 구독해야 합니다.

// 방송 메시지
StrixNetwork.instance.roomSession.roomClient.RoomRelayNotified

// 직접 메시지
StrixNetwork.instance.roomSession.roomClient.RoomDirectRelayNotified

알림 핸들러에는 NotificationEventArgs<RoomRelayNotification> 또는 NotificationEventArgs<RoomDirectRelayNotification> 타입으로 인수가 하나 있습니다. 이 개체에는 Data라고 하는 속성이 있습니다. 이것을 통해 수신 메시지와 그것을 보낸 방 멤버의 UID를 확인할 수 있습니다.

StrixNetwork.instance.roomSession.roomClient.RoomDirectRelayNotified += notification => {
    Debug.Log("Received a new relay message " + notification.Data.GetMessageToRelay() + " from " + notification.Data.GetFromUid());
}

메시지 내용

원시값

메시지가 int와 같은 원시 타입인 경우, 그대로 보내도 됩니다.

StrixNetwork.instance.SendRoomRelay(
    messageToRelay: 10,
    handler: null,
    failureHandler: null
);

커스텀 메시지

여러 가지 원시 타입을 보내고 싶다면 그것을 넣을 클래스를 정의하여 등록해야 합니다. 예를 들면 다음과 같습니다.

class MyCustomMessage
{
    public int Health;
    public string Name;
}

클래스를 정의한 후 메시지 클래스의 타입으로 ObjectFactory.Instance.Register를 호출하여 등록해야 합니다.

ObjectFactory.Instance.Register(typeof(MyCustomMessage));

이 조치는 메시지를 보내는 클라이언트와 그것을 받는 클라이언트에서 모두 실시해야 합니다.

이제 클래스를 릴레이 메시지로 사용할 수 있습니다.

StrixNetwork.instance.SendRoomRelay(
    messageToRelay: new MyCustomMessage {
        Health = 100,
        Name = "Stranger"
    },
    handler: null,
    failureHandler: null
)

참고

ObjectFactorySoftGear.Strix.Net.Serialization 네임스페이스에 명시된 Strix의 클래스입니다. 스크립트에 다음과 같은 using 디렉티브가 필요합니다.

using SoftGear.Strix.Net.Logging;

참고

커스텀 메시지 클래스는 방에 입장하기 전에 등록해야 합니다. 다른 클라이언트가 클래스를 등록하기 전에 커스텀 메시지 클래스의 릴레이 메시지를 보낼 경우, “Message Deserialize failed”라는 Strix 오류가 Unity 로그에 표시됩니다. 이것은 릴레이 메시지 알림 이벤트를 (아직) 구독하지 않았을 때도 마찬가지입니다.

직렬화

일반적으로 릴레이 메시지는 RPC와 동일한 직렬화를 이용합니다. 따라서 RPC의 직렬화 섹션을 참고하면 됩니다.