メッセージリレー

リレーメッセージの送信はRPCに似ていますが、ターゲットとしてネットワークオブジェクトを必要としません。メッセージはクライアントに直接送信されます。RPCとは異なり、引数はobjectとして渡される1つしか送信できないため、複数の引数を送信したい場合は、それらを1つのコンテナーオブジェクトに入れる必要があります。

リレーメッセージの送信

リレーメッセージを送信するためのメソッドグループは2種類あります。

  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. 直接送信

    これらのメソッドを使用すると、1人のルームメンバーのみに向けてメッセージを送信できます。受信者を指定するために、最初の引数としてUIDを渡す必要があります。

    ルームメンバーのUIDを取得するには、いくつかの方法があります。

    1. 最も簡単な方法は、そのメンバーに属するゲームオブジェクトを見つけて、そこからStrixReplicatorコンポーネントを取得し、このコンポーネントのownerUidプロパティを使用することです。

    2. 誰かがRPCまたはリレーメッセージを送信した場合、RPCの場合はStrixRpcContextsenderUidプロパティ、またはリレー通知のGetFromUid()メソッドを使用して送信者のUIDを取得できます。

    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はインターフェイス型です。2つのUIDを==演算子で比較することはできません。

リレーメッセージの受信

受信側では、リレーメッセージ通知イベントをサブスクライブする必要があります。

// メッセージのブロードキャスト
StrixNetwork.instance.roomSession.roomClient.RoomRelayNotified

// メッセージの直接送信
StrixNetwork.instance.roomSession.roomClient.RoomDirectRelayNotified

通知ハンドラーには、NotificationEventArgs <RoomRelayNotification>またはNotificationEventArgs<RoomDirectRelayNotification>タイプの引数が1つあります。このオブジェクトには、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
)

注釈

ObjectFactoryはStrixのクラスであり、SoftGear.Strix.Net.Serializationという名前空間で宣言されています。スクリプトには次のようなusingディレクティブが必要になるでしょう。

using SoftGear.Strix.Net.Serialization;

注釈

カスタムメッセージクラスはルームに参加する前に登録しておきましょう。クラスを登録する前に他のクライアントがカスタムメッセージクラスを使ったリレーメッセージを送ってくると、リレーメッセージ通知イベントを(まだ)サブスクライブしていなかったとしても、「Message Deserialize failed」というStrixのエラーがUnityのログに記録されます。

シリアル化

通常、リレーメッセージはRPCと同じシリアル化を使用します。RPCに関するシリアル化の説明を参照してください。