teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

コメントを受けて追記2

2017/11/14 07:39

投稿

fiveHundred
fiveHundred

スコア10439

answer CHANGED
@@ -77,4 +77,63 @@
77
77
  ``SceneManager.LoadScene(1, LoadSceneMode.Additive);``とすると、前のシーンが残ったままになってしまいます。
78
78
  自分で管理するのであれば問題ないですが、そうでなければ``LoadSceneMode.Additive``無しで実行し、毎回リセットしてしまった方がよいと思います。
79
79
  この場合、sceneCountは常に1になりますが、前述の変数を使えば問題ありません。
80
- また、前述の変数を格納しているスクリプトなど、リセット時に削除したくない物については、``DontDestroyOnLoad();``を使えばよいです。
80
+ また、前述の変数を格納しているスクリプトなど、リセット時に削除したくない物については、``DontDestroyOnLoad();``を使えばよいです。
81
+
82
+ ---
83
+ コメントを受けて追記2:
84
+
85
+ ``Application.LoadLevel ();``と``SceneManager.LoadScene();``はどちらもシーンの切り替えを行う関数です。
86
+ ``Application.LoadLevel ();``は非推奨になっている古い関数なため、stageクラスにある、``Application.LoadLevel ();``は全て``SceneManager.LoadScene();``に直した方がよいでしょう。
87
+
88
+ また、stageクラスでボタン押下時にステージを呼び出す処理をしているので、StageSelectでの押下時の処理は不要です。
89
+
90
+ それらを踏まえたうえで、スクリプトを書くとすると以下のようになります。
91
+
92
+ ・クリア画面のゲームオブジェクトにアタッチ
93
+ ```C#
94
+ using System.Collections;
95
+ using System.Collections.Generic;
96
+ using UnityEngine;
97
+
98
+ public class ClearCount : MonoBehaviour
99
+ {
100
+ // クリア回数
101
+ // staticにすることで新しいシーンを読み込んだ時でも削除されなくなる
102
+ public static int Count = 0;
103
+
104
+ void Awake()
105
+ {
106
+ // クリア回数をカウントする
107
+ Count++;
108
+ }
109
+ }
110
+ ```
111
+
112
+ ・ステージ選択画面のゲームオブジェクトにアタッチ
113
+ ```C#
114
+ using System.Collections;
115
+ using System.Collections.Generic;
116
+ using UnityEngine;
117
+ using UnityEngine.UI;
118
+
119
+ public class StageSelect : MonoBehaviour
120
+ {
121
+ // Inspectorからシーン上のボタンを登録しておく
122
+ public Button[] ButtonArray;
123
+
124
+ void Start()
125
+ {
126
+ // countの値を取得
127
+ int count = ClearCount.Count;
128
+
129
+ for (int loop = 0; loop < ButtonArray.Length; loop++)
130
+ {
131
+ // ボタンの有効化・無効化
132
+ ButtonArray[loop].gameObject.SetActive(loop < count);
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ただ、上記はあくまで質問の内容に添っただけなので、例えば「ステージ1を2回クリアした」場合については考慮していません。
139
+ また、セーブも行っていないため、アプリを終了するとステージ1からやり直しになります。

2

コメントを受けて追記

2017/11/14 07:39

投稿

fiveHundred
fiveHundred

スコア10439

answer CHANGED
@@ -54,4 +54,27 @@
54
54
 
55
55
  もし後者であれば、ボタンをシーンに配置するのではなく、ボタンをプレハブ化してそれを生成するのがよいと思います。
56
56
  この場合、新しいシーンを呼び出す際に``SceneManager.LoadScene()``を``LoadSceneMode.Additive``無しで実行すれば、全てリセットされます。
57
- この方法が難しい場合は、配列やリストにプレハブから生成したボタンを格納し、適当なタイミングでそれらをまとめて削除してしまえばよいでしょう。
57
+ この方法が難しい場合は、配列やリストにプレハブから生成したボタンを格納し、適当なタイミングでそれらをまとめて削除してしまえばよいでしょう。
58
+
59
+ ---
60
+ コメントを受けて追記:
61
+
62
+ > ゲームクリア画面をロードした回数でステージの開放をしたいと思っています。
63
+
64
+ それであれば、どこかに変数(初期値0)を用意しておき、ゲームクリア画面をロードしたときに、その変数を+1すればよいです。
65
+ そしてその変数の値を、switch文のあるスクリプトに渡せばよいです。
66
+
67
+ > 特定のシーン(ゲームクリア画面)が何回読み込まれたかを調べたいときはsceneCountではないのでしょうか?sceneCountが『現在ロードされているシーンの合計数。』と出てきたのでよくわからなくなってしまいました。
68
+
69
+ いま使われているシーンの数です。
70
+ 例えば、
71
+ 1. 起動時に最初のシーン0がロードされるので、このときはsceneCount=1になります。
72
+ 2. 次に``SceneManager.LoadScene(1, LoadSceneMode.Additive);``とすると、シーン0とシーン1があるので、sceneCount=2になります。
73
+ 3. もう一度``SceneManager.LoadScene(1, LoadSceneMode.Additive);``とすると、シーン0と2つのシーン1があるので、sceneCount=3になります。
74
+ 4. この後に``SceneManager.LoadScene(1);``とすると、全てのシーンを削除してから、新たにシーン1がロードされるので、sceneCount=1に戻ります。
75
+
76
+ いずれにしろ、``SceneManager.LoadScene(1, LoadSceneMode.Additive);``を使っている意味がよく分かりませんでした。
77
+ ``SceneManager.LoadScene(1, LoadSceneMode.Additive);``とすると、前のシーンが残ったままになってしまいます。
78
+ 自分で管理するのであれば問題ないですが、そうでなければ``LoadSceneMode.Additive``無しで実行し、毎回リセットしてしまった方がよいと思います。
79
+ この場合、sceneCountは常に1になりますが、前述の変数を使えば問題ありません。
80
+ また、前述の変数を格納しているスクリプトなど、リセット時に削除したくない物については、``DontDestroyOnLoad();``を使えばよいです。

1

追記

2017/11/10 02:33

投稿

fiveHundred
fiveHundred

スコア10439

answer CHANGED
@@ -41,4 +41,17 @@
41
41
  /* stageNoに応じてステージのシーンをロードする処理 */
42
42
  }
43
43
  }
44
- ```
44
+ ```
45
+
46
+ ---
47
+
48
+ 追記:
49
+ そもそも「解放」の意味自体の認識が合っているか分からなくなってきました。
50
+ - 進行に合わせてステージをアンロックする(第1ステージをクリアしたら第2ステージを解放する)
51
+ - ボタンをシーンに配置し、そのシーンを呼び出す形でボタンを生成し、ボタンを押下したらそれらのシーン全てを削除する
52
+
53
+ 私は前者だと思って先ほどの回答をしました。
54
+
55
+ もし後者であれば、ボタンをシーンに配置するのではなく、ボタンをプレハブ化してそれを生成するのがよいと思います。
56
+ この場合、新しいシーンを呼び出す際に``SceneManager.LoadScene()``を``LoadSceneMode.Additive``無しで実行すれば、全てリセットされます。
57
+ この方法が難しい場合は、配列やリストにプレハブから生成したボタンを格納し、適当なタイミングでそれらをまとめて削除してしまえばよいでしょう。