メッセージリレー¶
リレーメッセージの送信はRPCに似ていますが、ターゲットとしてネットワークオブジェクトを必要としません。メッセージはクライアントに直接送信されます。RPCとは異なり、引数はobject
として渡される1つしか送信できないため、複数の引数を送信したい場合は、それらを1つのコンテナーオブジェクトに入れる必要があります。
リレーメッセージの送信¶
リレーメッセージを送信するためのメソッドグループは2種類あります。
一斉送信
これらの方法を使用すると、全てのルームメンバーに向けて同時にメッセージを送信できます。
void SendRoomRelay(object messageToRelay, RoomRelayEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
void SendRoomRelay(RoomRelayMessage message, RoomRelayEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
このオーバーロードでは、メッセージ自体に加えて、メッセージを送信するルームのIDを指定できます。
注釈
ルームの外にリレーを送ることはできません。
直接送信
これらのメソッドを使用すると、1人のルームメンバーのみに向けてメッセージを送信できます。受信者を指定するために、最初の引数としてUIDを渡す必要があります。
ルームメンバーのUIDを取得するには、いくつかの方法があります。
最も簡単な方法は、そのメンバーに属するゲームオブジェクトを見つけて、そこから
StrixReplicator
コンポーネントを取得し、このコンポーネントのownerUid
プロパティを使用することです。誰かがRPCまたはリレーメッセージを送信した場合、RPCの場合は
StrixRpcContext
のsenderUid
プロパティ、またはリレー通知のGetFromUid()
メソッドを使用して送信者のUIDを取得できます。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のログに記録されます。