Unityにて横スクロールアクションゲームを作っています。
ステージ選択画面においてステージ解放処理を行いたいです。
sceneCountでクリア画面をロードした場合、countの値を増やして
switch文で条件分岐させ、countの値でステージ選択ボタンを解放しようと思っています。
###1.ボタンを非表示にさせ、switch分の処理による解放の関連付け
###2.sceneCountのスクリプト(ステージは4種類あります。)
現在書いているスクリプトはこちらになります。
C#
1public void LoadScene(){ 2Debug.Log(SceneManager.sceneCount); // 1 3SceneManager.LoadScene(1, LoadSceneMode.Additive); 4Debug.Log(SceneManager.sceneCount); // 2 5SceneManager.LoadScene(1, LoadSceneMode.Additive); 6Debug.Log(SceneManager.sceneCount); // 3 7SceneManager.LoadScene(1, LoadSceneMode.Additive); 8Debug.Log(SceneManager.sceneCount); // 4 9}
###3.どのシーンのゲームオブシェクトにスクリプトをつければいいのか
現在はこのような構成になっています。
・選択画面 (switch文)
・クリア画面 (sceneCount)
###4.sceneCountとswitch文の関連付け
こちらの4つを教えていただきたいです。
C#、Unity共に初めて扱うので分かりやすくスクリプト付きで説明していただけると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
「質問への追記・修正の依頼」の通り、よく分からない点が多いのですが、以下のソースで何か過不足などはありますでしょうか?
(選択画面のゲームオブジェクトにアタッチしてください)
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class StageSelect : MonoBehaviour 7{ 8 // Inspectorからシーン上のボタンを登録しておく 9 public Button[] ButtonArray; 10 11 void Start() 12 { 13 // countの値を取得 14 int count = /*countの値*/; 15 16 for (int loop = 0; loop < ButtonArray.Length; loop++) 17 { 18 if (loop < count) 19 { 20 // ボタンの有効化 21 ButtonArray[loop].gameObject.SetActive(true); 22 23 // ボタン押下時の処理 24 int stageNo = loop; 25 ButtonArray[loop].onClick.AddListener(() => { taskOnClick(stageNo); }); 26 } 27 else 28 { 29 // ボタンの無効化 30 ButtonArray[loop].gameObject.SetActive(false); 31 } 32 } 33 } 34 35 void taskOnClick(int stageNo) 36 { 37 /* stageNoに応じてステージのシーンをロードする処理 */ 38 } 39}
追記:
そもそも「解放」の意味自体の認識が合っているか分からなくなってきました。
- 進行に合わせてステージをアンロックする(第1ステージをクリアしたら第2ステージを解放する)
- ボタンをシーンに配置し、そのシーンを呼び出す形でボタンを生成し、ボタンを押下したらそれらのシーン全てを削除する
私は前者だと思って先ほどの回答をしました。
もし後者であれば、ボタンをシーンに配置するのではなく、ボタンをプレハブ化してそれを生成するのがよいと思います。
この場合、新しいシーンを呼び出す際にSceneManager.LoadScene()
をLoadSceneMode.Additive
無しで実行すれば、全てリセットされます。
この方法が難しい場合は、配列やリストにプレハブから生成したボタンを格納し、適当なタイミングでそれらをまとめて削除してしまえばよいでしょう。
コメントを受けて追記:
ゲームクリア画面をロードした回数でステージの開放をしたいと思っています。
それであれば、どこかに変数(初期値0)を用意しておき、ゲームクリア画面をロードしたときに、その変数を+1すればよいです。
そしてその変数の値を、switch文のあるスクリプトに渡せばよいです。
特定のシーン(ゲームクリア画面)が何回読み込まれたかを調べたいときはsceneCountではないのでしょうか?sceneCountが『現在ロードされているシーンの合計数。』と出てきたのでよくわからなくなってしまいました。
いま使われているシーンの数です。
例えば、
- 起動時に最初のシーン0がロードされるので、このときはsceneCount=1になります。
- 次に
SceneManager.LoadScene(1, LoadSceneMode.Additive);
とすると、シーン0とシーン1があるので、sceneCount=2になります。 - もう一度
SceneManager.LoadScene(1, LoadSceneMode.Additive);
とすると、シーン0と2つのシーン1があるので、sceneCount=3になります。 - この後に
SceneManager.LoadScene(1);
とすると、全てのシーンを削除してから、新たにシーン1がロードされるので、sceneCount=1に戻ります。
いずれにしろ、SceneManager.LoadScene(1, LoadSceneMode.Additive);
を使っている意味がよく分かりませんでした。
SceneManager.LoadScene(1, LoadSceneMode.Additive);
とすると、前のシーンが残ったままになってしまいます。
自分で管理するのであれば問題ないですが、そうでなければLoadSceneMode.Additive
無しで実行し、毎回リセットしてしまった方がよいと思います。
この場合、sceneCountは常に1になりますが、前述の変数を使えば問題ありません。
また、前述の変数を格納しているスクリプトなど、リセット時に削除したくない物については、DontDestroyOnLoad();
を使えばよいです。
コメントを受けて追記2:
Application.LoadLevel ();
とSceneManager.LoadScene();
はどちらもシーンの切り替えを行う関数です。
Application.LoadLevel ();
は非推奨になっている古い関数なため、stageクラスにある、Application.LoadLevel ();
は全てSceneManager.LoadScene();
に直した方がよいでしょう。
また、stageクラスでボタン押下時にステージを呼び出す処理をしているので、StageSelectでの押下時の処理は不要です。
それらを踏まえたうえで、スクリプトを書くとすると以下のようになります。
・クリア画面のゲームオブジェクトにアタッチ
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ClearCount : MonoBehaviour 6{ 7 // クリア回数 8 // staticにすることで新しいシーンを読み込んだ時でも削除されなくなる 9 public static int Count = 0; 10 11 void Awake() 12 { 13 // クリア回数をカウントする 14 Count++; 15 } 16}
・ステージ選択画面のゲームオブジェクトにアタッチ
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class StageSelect : MonoBehaviour 7{ 8 // Inspectorからシーン上のボタンを登録しておく 9 public Button[] ButtonArray; 10 11 void Start() 12 { 13 // countの値を取得 14 int count = ClearCount.Count; 15 16 for (int loop = 0; loop < ButtonArray.Length; loop++) 17 { 18 // ボタンの有効化・無効化 19 ButtonArray[loop].gameObject.SetActive(loop < count); 20 } 21 } 22}
ただ、上記はあくまで質問の内容に添っただけなので、例えば「ステージ1を2回クリアした」場合については考慮していません。
また、セーブも行っていないため、アプリを終了するとステージ1からやり直しになります。
投稿2017/11/08 06:17
編集2017/11/14 07:39総合スコア10275
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。