質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.35%

Unity2D リザルト画面にて星3つ(★)を各ステージごとに保存するには?≪前回の質問の続き≫

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 733

score 27

前提・実現したいこと

質問:teratail.com/questions/209559
の続きになるのですが、星を条件ごとに表示することはできましたが
その状態を保存する方法が思いつかなかった為質問することにしました。

星の表示条件
1.コインを0枚以上2枚以下でゴールすると左側の★のみ点灯       (★☆☆) ※ゴールすると必ず点灯
2.コインをすべて(3枚)取得してゴールすると左側と真ん中の★のみ点灯(★★☆)
3.コインを0枚でゴールすると左側と右側の★のみ点灯         (★☆★)

また1回目では★は2個ですべてそろうことはありません。
2回目で★がすべてそろう形になります。
 

1番と2番を達成した時の画像
イメージ説明

該当のソースコード

//コルーチン処理(コインの数に合わせて0.5fごとに☆を表示)
    IEnumerator Evaluation()
    {
        //まず今回のプレイで獲得した☆の数を求める
        if ((CoinTotal >= 0)&&(CoinTotal <= 2)) -------------(CoinTotal >= 0)だけでもいい?------------     
        {
            //コインが1から2枚
            Hoshi = 1;
        }
        else if(CoinTotal == 3)
        {
            //コインが3枚以上
            Hoshi = 2;
        }
        if(CoinTotal == 0)
        {
            Hoshi = 3;    
        }
ここでHoshiが3になるため2回目クリアすると条件に関係なくすべての星が点灯してしまう?


        //以前のプレイで獲得した☆の数を取得する
        var savedHosi = PlayerPrefs.GetInt("SAVESTAR" + StageNo, 0);

        //今回の☆とそれ以前の☆のうち大きい方を選ぶ
        Hoshi = Mathf.Max(Hoshi, savedHosi);

        //☆を表示する
        for (var i = 0; i < Hoshi; i++)
        {
------------前回の質問で改良した場所------------------------
            yield return new WaitForSeconds(0.7f);
            StarImage[0].SetActive(true);
            StarImage[1].SetActive(CoinTotal == 3);
            StarImage[2].SetActive(CoinTotal == 0);
-----------------------------------------------------------
        }

        //☆の数を保存する
        PlayerPrefs.SetInt("SAVESTAR" + StageNo, Hoshi);
    }

補足情報(言語/FW/ツール等のバージョンなど)

Unity 2018.3.11f1
言語:C#

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

ようやく理解しましたが、星3つを取る条件は「コイン0枚のプレイを最低1回、コイン3枚のプレイを最低1回」なんですね。(前回の質問に追記された内容を確認しました)
だとすると星表示条件に前回のプレイを含まないといけないので、根本的にコードが変わります。

ざっくり書くとこんな感じになるかと。(条件文違うかも&もっと効率良く書けるかもですが一応)
なお、保存と判定において「星3つの条件を既に満たしている(条件達成済みで3回目以降)」を「30」、
「一度もプレイしていない(前回のプレイ無し)」を「-1」としています。(ここの値は0〜3でなければ何でもいい)

//コルーチン処理(コインの数に合わせて0.5fごとに☆を表示)
    IEnumerator Evaluation()
    {
        //以前のプレイで獲得したコインの数を取得する
        var savedCoin = PlayerPrefs.GetInt("SAVECOIN" + StageNo, -1);

        // 左側は常に表示
        yield return new WaitForSeconds(0.7f);
        StarImage[0].SetActive(true);

        // 中央:今回か前回がコイン3、もしくは既に星3つ達成済みなら表示
        yield return new WaitForSeconds(0.7f);
        StarImage[1].SetActive(CoinTotal == 3 || savedCoin == 3 || savedCoin == 30);

        // 右側:今回か前回がコイン0、もしくは既に星3つ達成済みなら表示
        yield return new WaitForSeconds(0.7f);
        StarImage[2].SetActive(CoinTotal == 0 || savedCoin == 0 || savedCoin == 30);

        //コインの数を保存する
        //前回コイン0・今回コイン3、または、前回コイン3・今回コイン0→星3つ条件達成保存
        //上記ではなく、今回コイン0か3の場合→今回のコイン保存
        //(それ以外は次回の判定に何の影響も及ぼさないので保存しない)
        if ((savedCoin == 0 && CoinTotal == 3) || (savedCoin == 3 && CoinTotal == 0)) {
            PlayerPrefs.SetInt("SAVECOIN" + StageNo, 30);
        } else if (CoinTotal == 0 || CoinTotal == 3) {
            PlayerPrefs.SetInt("SAVECOIN" + StageNo, CoinTotal);
        }
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/04 04:08 編集

    ご回答有難うございます。
    前回に引き続きご教示いただき感謝いたします。
    sakura_hana様のソースを参考に組み込んだ所
    無事想定通りの動作をすることができました。

    有難うございました!

    キャンセル

+1

        if ((CoinTotal >= 0)&&(CoinTotal <= 2)) 
        {
            //コインが1から2枚
            Hoshi = 1;
        }
        else if(CoinTotal == 3)
        {
            //コインが3枚以上
            Hoshi = 2;
        }

        // これ↓
        if(CoinTotal == 0)
        {
            Hoshi = 3;    
        }

else ifではなくifなので独立したif文として判断されています。
なのでCoinTotal = 0のとき、最初のif文を通ってHoshi=1になったあと、下のif文にも引っかかりHoshi=3になります。

上記を直したとしても、まだ問題があります。
そもそもの段階で質問とソースの内容が違っている気がします。
ソース内コメントだと、コインが1-2枚の場合と書いてあるのに質問文では0以上2枚以下と書いてあるので意味が変わってしまいます。

CoinTotal >= 0 だと、0を含みます
でも、そのあとに CoinTotal == 0 の条件式が出てきていますがこれに到達することがありません。だって、CoinTotal = 0の場合は、先に上のif文に拾われて処理が終わるからです。

ソース内コメントにあわせるのであれば CoinTotal > 0で、1~2枚のときの処理を記述し、そのあとにコイン3枚と0枚のときを拾って処理をしてあげる形が考えられます。

        if ((CoinTotal > 0)&&(CoinTotal <= 2)) 
        {
            //コインが1から2枚
            Hoshi = 1;
        }
        else if(CoinTotal == 3)
        {
            //コインが3枚以上
            Hoshi = 2;
        }else if(CoinTotal == 0)
        {
            Hoshi = 3;    
        }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/04 04:19

    ご回答有難うございます。
    sakura_hana様のソースを参考にして無事問題が解決しました。

    また記載ミスがあり、誤解を与えてしまい申し訳ございません。

    キャンセル

+1

各ステージのid or nameと得点情報、3つの星なので3bit分のデータがあれば可能な気がします。

idにする場合はuuidを使って行うのが無難なやり方だと思います。nameにするなら重複しないように注意が必要ですが、機能自体に問題はないとか思います。

各ステージの3つの星は1が獲得済み、0が未獲得という風に行えば、データの圧縮も同時に可能なので便利かと思います。

下記のようにデータを組み、まずcsvかjsonで書き出し、読み込みを行うのが無難かと思います。

string int
id 星の点灯情報3つ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/04 04:14

    ご回答有難うございます。
    sakura_hana様のソースを参考にして無事問題が解決しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • Unity2D リザルト画面にて星3つ(★)を各ステージごとに保存するには?≪前回の質問の続き≫