0 支持
470 閲覧

unityを初めて一か月の初心者です。下記サイトのオンラインランキング実装をしようとして手順通り行ったのですが、取得中になって読込してくれません。

<!--[if mso & !supportInlineShapes & supportFields]> SHAPE  \* MERGEFORMAT <![endif]--><!--[if gte vml 1]> <![endif]--><!--[if !vml]-->image<!--[endif]--><!--[if gte vml 1]> <![endif]--><!--[if mso & !supportInlineShapes & supportFields]> <![endif]-->https://blog.naichilab.com/entry/webgl-simple-ranking

一週間色々考えてやってみましたが、答えがでませんでした。

多分、インポートするパッケージ内にあるスクリプト内のどこかに自分自身のScnene内のオブジェクトを紐づけする?と思ってスクリプトの中身を見ましたがC#がまだ理解していない事もあり、全く分かりませんでした。

どうしても実装したいので申し訳ないですが、対処方法が分かる方に助言頂きたいです。

↑再生時のゲームクリア後、画面

 〇取得中のまま

 〇今回のスコア 横数字02:03:04 クリア時固定数字のまま

 〇読込見つからない

サイトの手順通りに進めました。

1、APIキー設定、初期化完了(アプリケーションキーとクライアントキーをNCMBSettingsに入力完了)

NCMBManager.prefabとNCMBSettings.prefabをヒエラルキーに追加

2、パッケージのインポート

3、Unity-simple-rankingの設定

〇シーンをビルドに追加

〇EventSystemはヒエラルキーにあります

〇RankingLoader.prefabヒエラルキーに追加

〇RankingInfoをタイムに設定

4、呼び出す

ゲームクリア時に挿入

// Type == Time の場合

var millsec = 123456;

var timeScore = new System.TimeSpan (0000, millsec);

naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore)

        void Update ()

        {

           if(myTransform.childCount == 0)

           {

            // Type == Time の場合

            var millsec = 123456;

            var timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);

            naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);

           }

        }

ためした事

〇パッケージの新と古いのバージョンなど入れ替えなど色々なバージョンで試したが実行時同じ内容

〇取得中で進まない原因1のTimeScale 0をゲームクリア時、実装しない

〇取得中で進まない原因2のNCMBのオブジェクト名はプレハブからヒエラルキーにドラッグ&ドロップしてそのままの名前

実行時、大きなエラーらしきものはでていない?と思います(オレンジ、赤警告無し。)(下記は全部白表示注意マーク)↓

コンソール表示

〇【_getFindParams】beforeJsonData : {"className":"HiScore","where":{"objectId":""}}UnityEngine.Debug:Log(Object)

〇 【url】:https://mbaas.api.nifcloud.com/#######################【type】:GETUnityEngine.Debug:Log(Object)

〇 【StatusCode】:200【Error】:

〇 【_getFindParams】beforeJsonData : {"className":"HiScore","where":{},"limit":30,"order":"score"}UnityEngine.Debug:Log(Object)

〇 【url】:https://mbaas.api.nifcloud.com/######################## =score【type】:GET

〇 count : 0 UnityEngine.Debug:Log(Object)

説明不足な点があるかもしれませんが、解決方法が分かる方は助言宜しくお願いいたします。

閉鎖
初心者 (160 ポイント) | 470 閲覧

回答 1

+1 支持
ベストアンサー

void Update ()

        {

           if(myTransform.childCount == 0)

           {

            // Type == Time の場合

            var millsec = 123456;

            var timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);

            naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);

           }

        }

こちらのコードですが、Update()で毎回naichilab.RankingLoader.Instance.SendScoreAndShowRanking

の処理を呼んでいるのだとおもいます。

こちらを一回しか呼ばれないようにすれば表示できるかと思われます

一人前回答者 (1.9k ポイント)
選択
+1
やまだ様
早急な回答と、解決ポイントを的確に教えて頂き大変感謝致します。

Update ()を一回しか呼ばれないように、
始めにbool isCalledOnce = false;を宣言して
void Update ()

  if (!isCalledOnce)
        {
                if(myTransform.childCount == 0)
            {
                isCalledOnce = true;
                
                // Type == Time の場合
                var millsec = 123456;
                var timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);
                naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);
            }
        }
   }

〇時間の取得中
〇読込見つからない
2点解決できました。

本当にありがとうございます。

ですが、〇今回のスコア 横数字02:03:04 クリア時固定数字のまま
の1点がまだ変わらずそのままで時計が動いていません。(02:03:04でなぜかその固定数字のまま)

最後に申し訳ないんですが、時計のTimerを動かすにはどうしたらいいでしょうか?

自分のSecneで時計を動かしているTextオブジェクトをどこかに貼り付けないといけないでしょうか?

自分なりにtimerが動いてそうなパッケージのスクリプトでtimer += Time.deltaTime;でみたいなのを探しては見たんですが、そんなコードとか無く(自分が見落としているだけかもしれませんが)
こんな状況でのtimerが動かない参考の対処方が見つからず、現状知識が限界で解決できない状態になっております。

最後に申し訳ござしませんがTimerの動かせる助言等、なんでもいいので宜しくお願いいたします。
+1
var millsec = 123456;
var timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);
ここで固定の値を入れているのが原因かもしれません。

時間をスコアにする場合は、自分でタイマーをセットする必要があります。
やり方としては、Textオブジェクトの数字をUpdate()内でtimer += Time.deltaTimeしたものをテキストとして入れると良いと思います。
そして最後にランキングに送付する際に計算したタイマーの値をスコアとして登録する。といった感じになります。
(ここはやり方は複数あるので、ご自身のゲームに合うように調整してください)

簡単な説明になってしまいましたが、もしまだ不明点などありましたら返信ください
0
山田様
返信が遅くなりましたが、助言頂いた事をかみ砕いて少し前進いたしました。
山田様が言われた部分の↓
var millsec = 123456;
var timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);
naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);
がやはり原因があったようです。
上記二行をコメントにして、
naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);
の(timeScore)の部分を私シーンのtimerとして使っている変数を当てはめ(timer);としたら動いて記録ができました。

ですが、動きましたが二つの新たな問題に直面しました。
1、記録ができましたが記録ができるのは時間ではなくて数字として記録されてしまいます。
RankingInfoの時間typeで動かすと「スコアの方が違います。」とエラーが出て、
数字typeでは動かすと記録できます。
ですが、数字typeですので例えば1分30秒の記録になると 時間なら1:30になりますが、
数字なら90.0000と記載されてしまいます。


2、記録されるランキングボードが一人までしか記録されません。
記録される部分は so.Limit = 30;になっていますので30人まで記録されるようになっていますが、
新記録をだしても記録が上書きされて1人しか記載されません。
多分objectIdが一緒なんで上書きされていると思います。

1の問題は
時間typeで動かしたいので、
山田様が言われてたとおり
var millsec = 123456;
var timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);
の固定の値を上手くいじれたら解決できると思っています。

ですが上記2点色々調べていますが同じ状況の人がなかなかいなく、情報も少ないので答えがでません。(2の原因と同じ状況の人がいましたが回答はでていませんでした)

何回も質問コメントして申し訳ないですが、2つの解決方法が分かれば教えて頂けないでしょうか?

プログラムは自分で解決できる能力が大事なのは分かっているのですが、答えがどうしても出てこなく
解決が難しい状況になっております。

もし分かりましたら助言等頂けたら有難いです。

それと今回の件はちょっと長くなっていますのでこの質問コメントで最後にしようと思います。

山田様のおかげで前に進めました事はとても感謝しております。

とりあえず自分自身でも解決できるよう、もう少し頑張ります!
2021-02-08 質問・回答をMarkdownで入力できるようにしました。
2020-09-03 新たなスパム対策を導入しました。

175 質問

157 回答

163 コメント

214 ユーザー