🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

2回答

2709閲覧

Unity2D リザルト画面で獲得した★をステージ選択画面でも表示するには?

Z_Silver

総合スコア27

C#

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

0グッド

0クリップ

投稿2019/09/15 07:45

編集2019/09/21 15:18

###前提・実現したいこと
リザルト画面で、獲得した★の数をステージセレクト画面でも表示したいのですが
if文でどうにか単体(1ステージ分)は表示することはできましたが、このままだと
ただひたすらif文を繰り返すことになるので・・・(該当ソース2より)
if文以外で各ステージ分を表示する方法をご存知でしたらご教示ください。

ステージセレクトイメージ画像
イメージ説明
1画面にステージ数が7つあり、1ステージにつき★は3個で全部で21個ある状態です
###該当のソースコード1

gememain側のソース ゲームメインの星の保存処理 //コルーチン処理(コインの数に合わせて0.3fごとに☆を表示) IEnumerator Evaluation() { //以前のプレイで獲得したコインの数を取得する var savedCoin = PlayerPrefs.GetInt("SAVECOIN" + StageNo, -1); //左側の★は常に表示 yield return new WaitForSeconds(0.3f); StarImage[0].SetActive(true); ---獲得した1番目の★を保存--------- PlayerPrefs.SetInt("STARSAVE1" + StageNo, 1); //中央の★・今回か前回がコイン3、もしくは既に星3つ達成済みなら表示 yield return new WaitForSeconds(0.3f); StarImage[1].SetActive(CoinTotal == 3 || savedCoin == 3 || savedCoin == 30); //右側の★・今回か前回がコイン0、もしくは既に星3つ達成済みなら表示 yield return new WaitForSeconds(0.3f); StarImage[2].SetActive(CoinTotal == 0 || savedCoin == 0 || savedCoin == 30); //コインの数を保存する //前回コイン0で今回コイン3、または、前回コイン3で今回コイン0→星3つ条件達成保存 //上記ではなく、今回コイン0か3で星3つ条件未達成の場合→コイン保存 if ((savedCoin == 0 && CoinTotal == 3) || (savedCoin == 3 && CoinTotal == 0)) { PlayerPrefs.SetInt("SAVECOIN" + StageNo, 30); } else if(CoinTotal == 0 || CoinTotal == 3) { if (PlayerPrefs.GetInt("SAVECOIN" + StageNo) < 30) { PlayerPrefs.SetInt("SAVECOIN" + StageNo, CoinTotal); } } -------------------------------------------------------------------- 獲得した2番目と3番目の★を保存 if (CoinTotal == 0) { PlayerPrefs.SetInt("STARSAVE3" + StageNo, 1); } else if(CoinTotal == 3) { PlayerPrefs.SetInt("STARSAVE2" + StageNo, 1); } } ``` ###該当のソースコード2

--------StageSelect側のソース-------------

void start(){
int clearStageNo = PlayerPrefs.GetInt("CLEAR", 0);
for (int i = 0; i <= stageButtons.GetUpperBound(0); i++)
{
//ステージクリアしているかの有無
bool clearFlg = (clearStageNo >= i);
stageButtons[i].GetComponent<Button>().interactable = clearFlg;
LockImage[i].SetActive(!clearFlg);
}

if文でとりあえず表示(1ステージ、2ステージ、3ステージ・・・と続くと効率が悪い)

if (PlayerPrefs.GetInt("STARSAVE1" + clearStageNo) == 1)
{
starImage[0].SetActive(true);
}

if (PlayerPrefs.GetInt("STARSAVE2" + clearStageNo) == 1) { starImage[1].SetActive(true); } if (PlayerPrefs.GetInt("STARSAVE3" + clearStageNo) == 1) { starImage[2].SetActive(true); }

}

###補足情報(言語/FW/ツール等のバージョンなど) Unity 2018.3.11f1 言語:C# 追記 ゲームメインの★の保存は以下のように変更(該当ソース1) //★1番目、2番目、3番目の保存処理 PlayerPrefs.SetInt("STARSAVE" + 1 + StageNo, 1); PlayerPrefs.SetInt("STARSAVE" + 2 + StageNo, 1); PlayerPrefs.SetInt("STARSAVE" + 3 + StageNo, 1); ###改良後のソース

//セレクトボタン側(ソースはボタンにアタッチ済み)
--------hogefugapiyo様のソースを参考-------------

public GameObject[] starImage; //★画像

public int stageID; void Start() { // ここでステージの星チェック for (int i = 0; i < starImage.Length; i++) { starImage[i].SetActive(PlayerPrefs.GetInt("STARSAVE" + (i + 1) + stageID) == 1 ? true : false); Debug.Log("★" + PlayerPrefs.GetInt("STARSAVE" + (i + 1) + stageID)); } Debug.Log("ステージ" + stageID); }

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

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

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

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

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

guest

回答2

0

ベストアンサー

こういうのはステージセレクトボタン側にスクリプトを作って自分のことは自分でやらせるようにすると楽だと思います。
ステージセレクトボタン1個をまずPrefab化しておき、ボタン自体にスクリプトをアタッチします。

そしてステージ数の数だけそれをインスタンス化します。このときにステージIDをボタンのスクリプトに割り振ってあげます。ボタンスクリプト側では受け取ったステージIDの星がいくつあるのかを確認して自分の表示を変えます。

Instance化する側

cs

1 [SerializeField] GameObject btnPrefab; // ステージセレクトボタンのPrefab 2 int stageCount = 10; // ステージ数 3 4 public void CreateStageSelectButton(){ 5 6 for(int i = 1; i <= stageCount ; i++) { 7 var newBtn = Instantiate(btnPrefab); // ボタンを作成 8 newBtn.GetComponent<StageSelectButton>().Initialize(i); //ボタンの初期化 9 } 10 11 } 12

ステージセレクトボタン側(StageSelectButton.cs)

cs

1 [SerializeField] GameObject[] starImage; 2 int stageID; 3 4 public void Initialize(int id) { 5 this.stageID = id; 6 7 // ここでステージの星チェック 8 for (int i = 0; i < starImage.Length; i++) { 9 starImage[i].SetActive(PlayerPrefs.GetInt("STARSAVE" + (i+1) + stageID) == 1 ? true : false); 10 } 11 } 12 13 // ボタンが押されたときの処理 14 public void OnClickStageButton() { 15 Debug.Log("Stage" + stageID + "を読み込みます"); 16 } 17

投稿2019/09/20 00:39

hogefugapiyo

総合スコア3302

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

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

Z_Silver

2019/09/21 15:20 編集

ご回答有難うございます。返答が遅くなり申し訳ございません。 hogefugapiyo様のソースを参考に組み込んだ所、 ステージボタンが押されるまで、獲得した★が表示されない状態まで前進することができました。 後は常時ボタンを押さなくても★が表示されるようにするだけなのですが、 各ボタンの番号【int id】のidをstartメソッドに持ってくる方法がわからず止まっている状態です もしご存知でしたらご教示ください。 以下ソース(ボタンにアタッチ済) public GameObject[] starImage; //★画像 int stageID; public void Initialize(int id) { this.stageID = id; // ここでステージの星チェック for (int i = 0; i < starImage.Length; i++) { starImage[i].SetActive(PlayerPrefs.GetInt("STARSAVE" + (i + 1) + stageID) == 1 ? true : false); Debug.Log("★" + PlayerPrefs.GetInt("STARSAVE" + (i + 1) + stageID)); } Debug.Log("ステージ" + stageID); } よろしくお願い致します。
Z_Silver

2019/09/21 16:24 編集

申し訳ございません、初歩的なミスでした。 int stageIDの前にpublicをつけて自分で値を変更するだけで問題が解決できました。 これで無事この問題を解決することができました。有難うございました。
guest

0

ステージ1の星の保存なら、"STAR001" みたいな名前でセーブします
とりあえず、999ステージまでならこの方法でセーブしていけると思います

保存する値は星の数ではなく、ビット演算としてみるといいです
1つめの星だけ獲得なら、001(2進数)=1(10進数)
1つ目と3つ目の星なら、101(2進数)=5(10進数)
全部持っていれば、111(2進数)=7(10進数) という感じです

if 文の判定はこんな感じですね

if ((star & (1 << 0)) != 0) {1つ目の星持ってる} if ((star & (1 << 1)) != 0) {2つ目の星持ってる} if ((star & (1 << 2)) != 0) {3つ目の星持ってる}

投稿2019/09/15 08:58

izmktr

総合スコア2856

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

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

Z_Silver

2019/09/19 16:41 編集

ご回答有難うございます。返答が遅くなり申し訳ございません。 ビット演算で管理するということですがここでいう「star」はint型で 1,5,7の値を代入すればいいのでしょうか? 例: StarImage[0].SetActive(true);//★を表示 int star = 1;//1つ目の★を表示するタイミングで if ((star & (1 << 0)) != 0) { 1つ目の星持ってる } また「1つ目の星持ってる」とありますが そこにあたはめるのは 「PlayerPrefs.SetInt("STAR001" + StageNo, star);」で セーブした値を 該当のソースコード2のif文に持ってくる形になるのでしょうか? 自分の理解が及ばなくて恐縮なのですが 回答よろしくお願い致します。
izmktr

2019/09/20 05:18

2進数は理解できていますか? 3つ目の星のみ持ってる、という状況なら、100=4です 1つ目の星を持ってる、で書くべき処理は1つ目の星を持っているときにやってほしい処理です 今回の場合は1つ目の星を表示、となるでしょう
Z_Silver

2019/09/21 15:16

返信有難うございます。無事問題が解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問