Gs2-Ranking C#SDKから登録したスコアが一部ランキングに反映されない

102 views
Skip to first unread message

EtaOnm256

unread,
Dec 16, 2023, 7:49:38 PM12/16/23
to GS2 ユーザグループ
Gs2-Rankingを使おうとしています。

以前使っていたmbaasからランキングデータを移行するために
UnityではなくC#のコンソールアプリから
ユーザーの新規作成とスコアの登録を15回繰り返しました。

APIがエラーを返している様子はなく、
マネージメントコンソールからも
ユーザーIDに対してスコアが登録されているのが見えるにも関わらず、
一部のスコアがランキングに反映されていないように見えます。
スコアの最小最大値にも引っかかっていないはずです。

ネームスペースを作り直してやり直してみたところでは
同じような結果に見えるのでランダム発生ではないのかもしれませんが、
今のところ規則性も不明です。

以下にコードの抜粋を載せます。

            ConnectAndLogin();

            string category = "HiScore_Normal4";
            //string category = "HiScore_Normal_Archer5";
            //string category = "HiScore_Hard4";
            //string category = "HiScore_Hard_Archer5";

            string ranking_namespace = "Fanatic_Zeal4";
           
            using (var sr = new System.IO.StreamReader($"{category}.json"))
            {
                string sample = sr.ReadToEnd();//補足を参照

                Console.WriteLine("json形式に変換");
                JObject jsonObj = JObject.Parse(sample);

                Console.WriteLine("読み込み結果表示");
                foreach (JObject element in jsonObj["results"])
                {
                    string name = element["name"].ToString();
                    long score = (long)element["score"];
                    string stage = element["stage"].ToString();
                    string item = element["item"].ToString();
                    string area = element["area"].ToString();


                    Console.WriteLine($"name={name},score={score},stage={stage},item={item},area={area}");

                    (string, string) userpass = CreateNewUser();
                    //Login(userpass.Item1,userpass.Item2);

                    var request = new Gs2.Gs2Ranking.Request.PutScoreByUserIdRequest();
                    //var request = new Gs2.Gs2Ranking.Request.PutScoreRequest();

                    request.CategoryName = category;
                    request.Score = score;
                    request.Metadata = $"{name},{ stage},{ item},{ area}";
                    //request.AccessToken = accesstoken;
                    request.UserId = userpass.Item1;
                    request.NamespaceName = ranking_namespace;

                    if (score <= 100000)
                    {

                        var result = ranclient.PutScoreByUserIdAsync(request);
                        //var result = ranclient.PutScoreAsync(request);

                        result.Wait();

                        if(!result.IsCompletedSuccessfully)
                        {
                            throw new Exception("失敗");
                        }
                    }
                }
            }
           
            {
                //Login("0579bd04-aa59-4337-8082-6f3de56bea5e", "qAzCZtmRgcboXlaAjRcREyudmxyAeVCE");

                var request = new Gs2.Gs2Ranking.Request.CalcRankingRequest();

                request.CategoryName = category;
                request.NamespaceName = ranking_namespace;

                var result = ranclient.CalcRankingAsync(request);

                result.Wait();

                while (result.Result.Processing.Value) ;
            }


ご教示のほどよろしくお願いいたします。

丹羽一智

unread,
Dec 17, 2023, 3:52:16 AM12/17/23
to GS2 ユーザグループ, EtaOnm256
PutScore や CalcRanking はサーバーサイドで非同期で処理され、直ちに終了しません。
PutScore は通常数秒、CalcRanking はスコアの数によって最大15分の時間を要します。

そのため、いただいたコードでは CalcRanking を呼び出したタイミングで PutScore によって設定されたスコアが全て含まれる保証はありません。

時間をおいてデータの量を確認ください。

Kazutomo Niwa
2023年12月17日 9:49 +0900、EtaOnm256 <manab...@hotmail.com> のメール:

EtaOnm256

unread,
Dec 17, 2023, 7:33:42 AM12/17/23
to GS2 ユーザグループ, 丹羽一智, EtaOnm256
最後のPutScoreから1時間以上待った上で
再度CalcRankingのみを呼び出し、
その後さらに1時間以上待つのも試したのですが、
状況に変化がありませんでした。
お伝えし忘れてすみません。
2023年12月17日日曜日 17:52:16 UTC+9 丹羽一智:

EtaOnm256

unread,
Dec 29, 2023, 6:50:58 AM12/29/23
to GS2 ユーザグループ, EtaOnm256, 丹羽一智, EtaOnm256
各処理は実際に終了する前に時間差があるとのことから、
試しにPutScoreの間に10秒のウェイトを入れてみましたが、
やはり一部反映されないスコアがあります。
(100個登録しようとすると7~10個程度抜ける)
また、試しに1個登録するたびにGs2RestSessionをクローズして
作り直してみましたが、結果は同様でした。

問題を再現するプロジェクトを添付します。
まとめると、

・C#のSDKからユーザーの作成とスコアの登録を繰り返した。登録まではされているように見える
・その後、時間を置いてスコアの再集計をしてもランキングに反映されないものがある
・間隔を空けても毎回セッションを作り直しても改善せず

もしかすると、このような使い方自体が間違いでしょうか?
その場合、他のmbaasからのデータの移行方法はどうすべきでしょうか?
2023年12月17日日曜日 21:33:42 UTC+9 EtaOnm256:
GS2RankingTest.zip
Reply all
Reply to author
Forward
0 new messages