GS2-Chat

チャットを GS2 SDK for Unity から利用する手順を解説します。

ロビーを作成する

GS2マネージメントコンソールの GS2-Chat から新しくロビーを作成します。

ロビーは複数のチャットルームを束ねる単位です。

../../../_images/スクリーンショット_2017-10-21_13.15.51.png

『ロビーの新規作成』をクリックします。

../../../_images/スクリーンショット_2017-10-21_13.16.15.png

ロビーの設定を入力します。

『新着メッセージ通知方式』には購読しているチャットルームに新しいメッセージが送信されたときに通知する先を指定します。

『なし』と『WebHook』と『GS2-InGamePushNotification』が指定できます。

『WebHook』を指定した場合は、追加で通知を受けるURLを指定します。

通知するべきイベントが発生すると、指定されたURLに以下のJSONがPOSTされます。

{
  "_gs2_service": "GS2-Chat#Receive",
  "notificationUserIds": [
    通知先ユーザID
  ],
  "roomId": 発言されたルームID,
  "userId": 発言したユーザのユーザID,
  "message": {
    "text": メッセージテキスト,
    "meta": メタデータ,
  }
}

『GS2-InGamePushNotification』を指定すると GS2-InGamePushNotification を使用して通知します。

通知は以下のフォーマットで送信されます。

{
  "subject": メッセージテキスト,
  "body": {
    "_gs2_service": "GS2-Chat#Receive",
    "roomId": 発言されたルームID,
    "userId": 発言したユーザのユーザID,
    "message": {
      "text": メッセージテキスト,
      "meta": メタデータ,
    }
  }
}

チャット機能を実装

ここからは Unity を使用した実装になります。

まずはログイン処理を実装する必要があります。ログインして Gs2.GameSession を取得するまでの手順は GS2-Auth をご参照ください。

ここからはログインが完了している前提で説明を進めます。

チャットルームを作成 / 削除

チャットルームの作成・削除 は Unity SDK からは実行できません。

これはクライアントによって無秩序にルームの作成・削除が行われることを避けるためです。

GS2-Chat では以下のような使い方を想定しています。

  • 事前に100個のチャットルームを作成し、それをチャンネルという形で表現し、ユーザに所属するチャンネルを選択させる。
  • マッチメイキング完了時に呼び出される WebHook や GS2-Script でルームを作成する

チャットルームを購読/解除

チャットルームを購読することで、該当するチャットルームに新規発言があったときに通知を受けることが出来ます。

ここでは 通知方式に『GS2-InGamePushNotification』 を指定した場合を想定したサンプルを掲載します。

yield return Gs2.Chat.Subscribe(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビーの名前
    RoomId,     // 購読するルームID
    false,      // 通知を送信したときにユーザがオフラインだったときに転送するか
    null        // オフライン転送時のモバイルプッシュ通知転送の通知音に使用するファイル名
);
yield return Gs2.Chat.Unsubscribe(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId      // ルームID
    );

購読するだけでは通知を受けることが出来ません。

以下で示すように、通知を受け取るイベントハンドラを設定する必要があります。

Gs2.Chat.OnReceiveMessage += notification =>
{
    Debug.Log("RoolID: " + notification.RoomId);
    Debug.Log("UserId: " + notification.UserId);
    Debug.Log("Message.Text: " + notification.Message.Text);
    Debug.Log("Message.Meta: " + notification.Message.Meta);
};
Gs2.Chat.SetInGamePushNotificationSession(session);

これで、ルームが新着メッセージを受け取った際に OnReceiveMessage に指定したイベントハンドラが呼び出されます。

購読しているルーム一覧取得

自分が購読しているルームの一覧を取得できます。

yield return gs2.Chat.ListSubscribe(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        else
        {
            // 購読しているルームのリスト
            Debug.Log("Length: " + r.Result.Subscribes.Length);
            foreach (var subscribe in r.Result.Subscribes)
            {
                Debug.Log("RoomId: " + subscribe.RoomId);
            }
            Debug.Log("NextPageToken: " + r.Result.NextPageToken);    // 次のページを取得するためのページトークン
        }
    },
    Session,    // ゲームセッション
    LobbyName,    // ロビー名
    RoomId,        // ルームID
    10,            // 最大取得件数
    null        // ページトークン(nullを指定することで先頭から取得)
    );

メッセージを送信

チャットルームにメッセージを発言するときは以下のように実装します。

yield return gs2.Chat.Send(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId,     // ルームID
    "Hello",    // メッセージテキスト
    "meta",     // メッセージメタデータ
    null        // パスワード(ルームにパスワードが設定されている場合に必要)
);

メッセージを受信

メッセージを受信する場合は以下のように実装します。

yield return gs2.Chat.List(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        if (r.Result.Count > 0)
        {
            // メッセージの受信処理
            foreach (var message in r.Result)
            {
                Debug.Log("From: " + message.From);
                Debug.Log("Text: " + message.Text);
                Debug.Log("Meta: " + message.Meta);
                Debug.Log("SendDate: " + message.SendDate);    // 最後に受信したメッセージの送信時刻を、次回以降メッセージを取得する際の startAt に指定することでメッセージをストリーム出来ます。
            }
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId,     // ルームID
    10,         // メッセージの取得件数
    startAt     // メッセージの取得開始日時(現在時刻から1時間前まで指定可能)
    );

この関数をポーリングすることでもチャットストリームを実現できますが、

ルームを購読し、OnReceiveMessage イベントをきっかけとして、この関数を呼び出すことでよりスマートに機能を実装できます。