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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

849閲覧

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

Z_Silver

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/09/02 23:03

###前提・実現したいこと
質問: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#

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

C#

1//コルーチン処理(コインの数に合わせて0.5fごとに☆を表示) 2 IEnumerator Evaluation() 3 { 4 //以前のプレイで獲得したコインの数を取得する 5 var savedCoin = PlayerPrefs.GetInt("SAVECOIN" + StageNo, -1); 6 7 // 左側は常に表示 8 yield return new WaitForSeconds(0.7f); 9 StarImage[0].SetActive(true); 10 11 // 中央:今回か前回がコイン3、もしくは既に星3つ達成済みなら表示 12 yield return new WaitForSeconds(0.7f); 13 StarImage[1].SetActive(CoinTotal == 3 || savedCoin == 3 || savedCoin == 30); 14 15 // 右側:今回か前回がコイン0、もしくは既に星3つ達成済みなら表示 16 yield return new WaitForSeconds(0.7f); 17 StarImage[2].SetActive(CoinTotal == 0 || savedCoin == 0 || savedCoin == 30); 18 19 //コインの数を保存する 20 //前回コイン0・今回コイン3、または、前回コイン3・今回コイン0→星3つ条件達成保存 21 //上記ではなく、今回コイン0か3の場合→今回のコイン保存 22 //(それ以外は次回の判定に何の影響も及ぼさないので保存しない) 23 if ((savedCoin == 0 && CoinTotal == 3) || (savedCoin == 3 && CoinTotal == 0)) { 24 PlayerPrefs.SetInt("SAVECOIN" + StageNo, 30); 25 } else if (CoinTotal == 0 || CoinTotal == 3) { 26 PlayerPrefs.SetInt("SAVECOIN" + StageNo, CoinTotal); 27 } 28 }

投稿2019/09/03 01:57

編集2019/09/03 02:00
sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z_Silver

2019/09/03 19:23 編集

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

0

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

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

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

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

stringint
id星の点灯情報3つ

投稿2019/09/03 00:48

編集2019/09/03 00:57
stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z_Silver

2019/09/03 19:14

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

0

cs

1 if ((CoinTotal >= 0&&(CoinTotal <= 2)) 2 { 3 //コインが1から2枚 4 Hoshi = 1; 5 } 6 else if(CoinTotal == 3) 7 { 8 //コインが3枚以上 9 Hoshi = 2; 10 } 11 12 // これ↓ 13 if(CoinTotal == 0) 14 { 15 Hoshi = 3;     16 }

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枚のときを拾って処理をしてあげる形が考えられます。

cs

1 if ((CoinTotal > 0&&(CoinTotal <= 2)) 2 { 3 //コインが1から2枚 4 Hoshi = 1; 5 } 6 else if(CoinTotal == 3) 7 { 8 //コインが3枚以上 9 Hoshi = 2; 10 }else if(CoinTotal == 0) 11 { 12 Hoshi = 3;     13 }

投稿2019/09/03 00:36

編集2019/09/03 00:47
hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z_Silver

2019/09/03 19:19

ご回答有難うございます。 sakura_hana様のソースを参考にして無事問題が解決しました。 また記載ミスがあり、誤解を与えてしまい申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問