ゲーム中に様々な理由でサーバーとの接続が切断されることがあります。接続が切断された時、既存のプレイを継続できるように再接続機能をサポートします。使用するAPIは一般的な接続方法と同じですが、結果として受け取る情報に違いがあります。
ConnectionAgentのConnect関数を利用してサーバーに接続します。一般的な場合と同じです。
/// <summary>
/// GameAnvilサーバーに接続試行
/// </summary>
/// <param name="ip">対象IPアドレス</param>
/// <param name="port">対象ポート</param>
/// <param name="onConnect">接続試行結果を受け取るデリゲート</param>
connector.GetConnectionAgent().Connect(ip, port, (ConnectionAgent connectionAgent, ResultCodeConnect result) => {
/// <param name="connectionAgent">Connect()をリクエストしたコネクションエージェント</param>
/// <param name="result">Connect()リクエスト結果コード</param>
if (result == ResultCodeConnect.CONNECT_SUCCESS) {
// 接続成功
}
else {
// 接続失敗
}
});
ConnectionAgentのAuthenticate関数を利用して認証手続きを行います。入力値は一般的な場合と同じです。ただ、認証の結果として受け取った値のうちloginedUserInfoListに以前プレイしていたユーザー情報が入ってきます。
/// <summary>
/// GameAnvilサーバーに認証リクエスト<para></para>
/// 認証成功後、コネクタ使用可能
/// </summary>
/// <param name="deviceId">ユーザーのデバイスを識別するための固有のID。サーバーの実装により、使用しない場合は空の文字列を伝達</param>
/// <param name="accountId">ユーザーアカウントを識別できる固有のID</param>
/// <param name="passwd">ユーザーアカウントのパスワード。サーバーの実装により、使用しない場合は空の文字列を伝達</param>
/// <param name="onAuthentication">リクエスト結果を受け取るデリゲート</param>
connector.GetConnectionAgent().Authenticate(deviceId, accountId, password, payload
(ConnectionAgent connectionAgent, ResultCodeAuth result, List<ConnectionAgent.LoginedUserInfo> loginedUserInfoList, string message, Payload payload) => {
/// <param name="connectionAgent">Authentication()をリクエストしたコネクションエージェント</param>
/// <param name="result">Authentication()リクエスト結果</param>
/// <param name="loginedUserInfoList">サーバーに残っているログイン情報リスト</param>
/// <param name="message">サーバーから受け取ったメッセージ</param>
/// <param name="payload">サーバーから受け取った追加情報</param>
if (result == ResultCodeAuth.AUTH_SUCCESS) {
foreach(ConnectionAgent.LoginedUserInfo loginedUserInfo in loginedUserInfoList)
{
// プレイユーザー情報
}
}
});
認証結果で受け取ったユーザー情報を使ってログインをします。この時、userTypeやchannelIdなど以前のユーザー情報と同じ値を使ってログインする必要があります。そうしないと、ログインが失敗する可能性があります。
/// <summary>
/// ユーザーエージェントを探して返す
/// </summary>
/// <param name="serviceName">ユーザーエージェントが使用するサービス名</param>
/// <param name="subId">サービス別ユーザーエージェントを識別できる固有ID</param>
/// <returns>該当ユーザーエージェント、なければnull</returns>
UserAgent userAgent = Connector.GetUserAgent(loginedUserInfo.ServiceName, loginedUserInfo.SubId);
/// <summary>
/// サービスにログイン
/// </summary>
/// <param name="userType">ユーザーのタイプ </param>
/// <param name="payload">サーバーに伝達する追加情報</param>
/// <param name="channelId">ログインするチャンネルのID</param>
/// <param name="onLogin">結果を受け取るデリゲート</param>
userAgent.Login(loginedUserInfo.UserType, loginedUserInfo.ChannelId, null,
(UserAgent agent, ResultCodeLogin result, UserAgent.LoginInfo loginInfo) => {
/// <param name="userAgent">Login()をリクエストしたユーザーエージェント</param>
/// <param name="result">Login()リクエスト結果</param>
/// <param name="loginInfo">ログイン情報</param>
if (result == ResultCodeLogin.LOGIN_SUCCESS) {
if(loginInfo.IsRelogined){
// 再接続
}else{
// 最初の接続
}
}
});
ログイン成功時、UserAgent.LoginInfoのIsReloginedがtrueなら再接続ログインに成功したことになります。UserAgent.LoginInfoに含まれている情報を基に再接続処理を行ってください。この時、一番重要なことは再接続時間の間、サーバーの変更されたデータをクライアントに同期することです。この同期に必要なデータをUserAgent.LoginInfoのPayloadに入れて処理できます。
再接続ログインをすると、サーバーではBaseUser.onRelogin()コールバックが呼び出されます。この時、同期に必要なメッセージを定義してoutPayloadパラメータに追加すると、UserAgent.LoginInfoのPayloadで受け取って処理できます。
もし、IsReloginedがfalseであれば、時間が過ぎて以前のユーザー情報が削除された後、ログインされたことになります。この場合は、初めてログインする手順を実行してください。