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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3124閲覧

Unity シーンの移動で意図した通りに切り替わらない。

Aruku

総合スコア1

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/10/22 09:58

編集2020/10/22 12:05

閲覧いただきありがとうございます。

Unity初心者です。
ググってやってみたり、参考URLで確認したり、いろいろ試してみましたが解決できなかったので、質問いたしました。
初めての質問なので、説明不足などありましたらごめんなさい。

前提

・タイトルシーン

ボタン2つ設定しており、それぞれボタンを押すと、Canvasで作成した
・遊び方画面(HowToPlay) ・・・最初の画面(TitleObject)に戻るボタンを設置)
・難易度選択画面(StageSelect)・・・ 選択した難易度のシーンに移動するボタンと、最初の画面(TitleObject)に戻るボタンを設置

が表示されるようになっています。

・ゲームシーン(Easy)・・・現段階で作成した難易度はEasyのみとなっています。 

クリアorゲームオーバーになると同じくCanvasで作成した
・クリア画面(ClearObject)・・・リトライするボタンとタイトルシーンに戻るボタンを設置)
・ゲームオーバー画面(GameOver)・・・リトライするボタンとタイトルシーンに戻るボタンを設置)

が表示されます。

実現したいこと

  1. タイトルシーンの難易度選択をクリック → 難易度選択画面 → Easy → クリア画面 or ゲームオーバー画面 → タイトルシーン...

  2. クリア画面 or ゲームオーバー画面でリトライボタンをクリック → ゲームをプレイして、再びクリア画面 or ゲームオーバー画面を表示 → リトライボタンで再びゲームプレイ...

発生している問題・エラーメッセージ

実現したいことの内容に関して、

・1で難易度選択画面からボタンを押して、Easyに移動すると、ゲームオーバー画面が表示された状態で読み込まれます。おそらくEasySceneに移動したときに、lifeが0になり、ゲームオーバーのフラグがfalseからtrueになってしまっていること(下記コード参照)が一つの原因かと考えられます。
また、このときリトライするボタンとタイトルシーンに戻るボタンを押しても反応しません。

・2でリトライ後にもう一回ゲームをプレイした後に、Titleに戻るボタンとリトライボタンが反応せず、それぞれ対応するシーンと画面に移動することができません。2回目以降OnClickがうまく機能してくれていないようです。

参考にしたURLはこちらです。
Unity入門【初心者でもゼロから作れるUnity使い方講座】
https://dkrevel.com/makegame-beginner/

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using UnityEngine.SceneManagement; 7using UnityEngine.EventSystems; 8 9public class GameManager : MonoBehaviour 10{ 11 #region//インスペクターで設定 12 [Header("GameManager")]public static GameManager instance = null; 13 [Header("ライフ")] public int life; 14 [Header("Target1がゴールした数")] public int target1CountScore; 15 [Header("Target2がゴールした数")] public int target2CountScore; 16 [Header("クリア変数")] public bool isClear = false; 17 [Header("ゲームオーバー変数")] public bool isGameover = false; 18 [Header("TitleObject")] public GameObject TitleObject; 19 [Header("HowToPlay")] public GameObject HowToPlay; 20 [Header("StageSelect")] public GameObject StageSelect; 21 #endregion 22 23 #region//プライベート変数 24 private Rigidbody2D rb; 25 private bool isHowToPlay = false; 26 private bool isStageSelect = false; 27 // private bool isEasyScene; 28 #endregion 29 // Start is called before the first frame update 30 31 private void Awake() 32 { 33 if(instance == null) 34 { 35 instance = this; 36 DontDestroyOnLoad(this.gameObject); 37 } 38 else 39 { 40 Destroy(this.gameObject); 41 } 42 43 /* DontDestroyOnLoad(TitleObject); 44 DontDestroyOnLoad(HowToPlay); 45 DontDestroyOnLoad(StageSelect);*/ 46 47 } 48 void Start() 49 { 50 //タイトルシーンが読み込まれた時の状態 51 TitleObject.SetActive(true); 52 HowToPlay.SetActive(false); 53 StageSelect.SetActive(false); 54 55 rb = GetComponent<Rigidbody2D>(); 56 57 //Easyを読み込んだ時のlife 58 if (SceneManager.GetActiveScene().name == "Easy") 59 { 60 life = 5; 61 } /*else if (SceneManager.GetActiveScene().name == "Normal") 62 { 63 LoadNormalScene(); 64 } 65 else if (SceneManager.GetActiveScene().name == "Hard") 66 { 67 LoadHardScene(); 68 }*/ 69 70 } 71 72 // Update is called once per frame 73 void Update() 74 { 75 76 } 77 78 #region//リトライ 79 public void RetryGame() 80 { 81 target1CountScore = 0; 82 target2CountScore = 0; 83 isClear = false; 84 isGameover = false; 85 if(SceneManager.GetActiveScene().name == "Easy") 86 { 87 LoadEasyScene(); 88 life = 5; 89 } /*else if (SceneManager.GetActiveScene().name == "Normal") 90 { 91 LoadNormalScene(); 92 } 93 else if (SceneManager.GetActiveScene().name == "Hard") 94 { 95 LoadHardScene(); 96 }*/ 97 } 98 #endregion 99 100 #region//タイトルシーンに移動 101 public void LoadTitleScene() 102 { 103 if (SceneManager.GetActiveScene().name == "Easy") 104 { 105 SceneManager.LoadScene("TitleScene"); 106 } 107 108 } 109 #endregion 110 111 #region//Easy読み込み 112 public void LoadEasyScene() 113 { 114 115 SceneManager.LoadScene("Easy"); 116 if (isStageSelect) 117 { 118 isStageSelect = false; 119 } 120 } 121 #endregion 122 123 /*public void LoadNormalScene() 124 { 125 SceneManager.LoadScene("Normal"); 126 } 127 128 public void LoadHardScene() 129 { 130 SceneManager.LoadScene("Hard"); 131 }*/ 132 133 #region//StageSelect画面に移動 134 public void GoStageSelect() 135 { 136 TitleObject.SetActive(false); 137 isStageSelect = true; 138 StageSelect.SetActive(true); 139 } 140 #endregion 141 142 #region//HowToPlay画面に移動 143 public void GoHowToPlay() 144 { 145 TitleObject.SetActive(false); 146 isHowToPlay = true; 147 HowToPlay.SetActive(true); 148 } 149 #endregion 150 151 #region//タイトルシーンの最初の画面に移動 152 public void GoTitleObject() 153 { 154 TitleObject.SetActive(true); 155 if (isHowToPlay) 156 { 157 isHowToPlay = false; 158 HowToPlay.SetActive(false); 159 } else if (isStageSelect) 160 { 161 isStageSelect = false; 162 StageSelect.SetActive(false); 163 } 164 } 165 #endregion 166 167 168} 169

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class LifeTextScript : MonoBehaviour 7{ 8 #region//インスペクターで設定 9 public GameObject GameOver; 10 #endregion 11 12 #region//プライベート変数 13 private Text lifeText; 14 private int oldLife; 15 #endregion 16 17 // Start is called before the first frame update 18 void Start() 19 { 20 lifeText = GetComponent<Text>(); 21 GameOver.SetActive(false); 22 23 if(GameManager.instance != null) 24 { 25 lifeText.text = "Life " + GameManager.instance.life; 26 } 27 else 28 { 29 Destroy(this); 30 } 31 } 32 33 // Update is called once per frame 34 void Update() 35 { 36 if(oldLife != GameManager.instance.life) 37 { 38 lifeText.text = "Life " + GameManager.instance.life; 39 oldLife = GameManager.instance.life; 40 } else if(GameManager.instance.life <=0) 41 { 42 lifeText.text = "Life 0"; 43 GameOver.SetActive(true); 44 GameManager.instance.isGameover = true; 45 } 46 } 47}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Target1GoalScript : MonoBehaviour 6{ 7 #region//インスペクターで設定 8 [Header("ゴールするまでの数")]public int Target1Score; 9 [Header("Target1をカウントする")] public int Target1Count; 10 [Header("Target2をカウントする")] public int Target2Count; 11 [Header("ClearObject")] public GameObject ClearObject; 12 #endregion 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 18 ClearObject.SetActive(false); 19 } 20 21 // Update is called once per frame 22 void Update() 23 { 24 25 } 26 27 #region//ゴールした時の処理 28 private void OnTriggerEnter2D(Collider2D collision) 29 { 30 if(collision.gameObject.CompareTag("Burden")) 31 { 32 //Debug.Log("Target1Goal"); 33 Destroy(collision.gameObject); 34 GameManager.instance.target1CountScore += Target1Score; 35 if(GameManager.instance.target1CountScore >= Target1Count && GameManager.instance.target2CountScore >= Target2Count) 36 { 37 //Debug.Log("12Ok"); 38 ClearObject.SetActive(true); 39 GameManager.instance.isClear = true; 40 41 } 42 } 43 } 44 #endregion 45} 46

*Targe1GoalScriptの他にほぼ同じ内容のTarget2GoalScriptもあります。

・ButtonのOnClick()をすべて設定してあることは確認済みです。
・Build Settingの方もTitleSceneとEasyが入っていました。
・Easyから読み込んでTitleSceneに戻った時もHowToPlayやStageSelectに移動できなくなっていました。

初心者なので拙いコードで申し訳ありませんが、解決方法や、改善点などよろしくお願いいたします。

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

Windows 10
Unity 2020.4.1f1使用

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

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

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

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

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

sakura_hana

2020/10/23 00:50

Debug.Logを各所に仕込んでどうなっているか確認してください。(特に「isStageSelect」等のフラグ類) 「ボタンがクリックできない(=OnClickに設定されたメソッドが呼ばれない)」のか、「クリックはできてOnClickに設定されたメソッドは呼ばれるがその中身が実行されない」のかでは考えられる原因と対策が異なるのでそこをはっきりさせてください。
Aruku

2020/10/24 04:35 編集

ご回答ありがとうございます。 Debug.Logを差し込んだところ、OnClickに設定したメソッドそのものが呼び出されていないようでした。
guest

回答2

0

自己解決

遅くなりました。

もう一回自分で調べたりしながら、以下の方法でなんとか解決することができました。
Normal, Hardも作りましたが、それぞれのシーン分岐もできました。
みなさんありがとうございました!

  1. タイトルシーンに新たにカラのTitleSceneGameObjectCtrlを作る。
  2. 以下のスクリプトを作成

参考URL
https://xr-hub.com/archives/11782

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TitleSceneGameObjectCtrlScript : MonoBehaviour 6{ 7 [SerializeField] GameObject TitleObject; 8 [SerializeField] GameObject HowToPlay; 9 [SerializeField] GameObject StageSelect; 10 11 // Start is called before the first frame update 12 void Start() 13 { 14 GoBackToTitle(); 15 } 16 17 // Update is called once per frame 18 void Update() 19 { 20 21 } 22 23 #region//StageSelect画面に移動 24 public void GoStageSelect() 25 { 26 StageSelect.SetActive(true); 27 HowToPlay.SetActive(false); 28 TitleObject.SetActive(false); 29 } 30 #endregion 31 32 #region//HowToPlay画面に移動 33 public void GoHowToPlay() 34 { 35 HowToPlay.SetActive(true); 36 StageSelect.SetActive(false); 37 TitleObject.SetActive(false); 38 39 } 40 #endregion 41 42 public void GoBackToTitle() 43 { 44 TitleObject.SetActive(true); 45 HowToPlay.SetActive(false); 46 StageSelect.SetActive(false); 47 } 48 49} 50

投稿2020/10/28 12:59

Aruku

総合スコア1

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

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

0

症状からおそらくとしか言えないのですが
とりあえずライフ5のときに問題ないか確認のために初期値をいれて試してみてください。これでいきなりGameOverにならないと思います。

[Header("ライフ")] public int life = 5;

つぎに各所にある
if (SceneManager.GetActiveScene().name == "Easy")
の分岐に入れてないように思えます。
とりあえずはStartメソッドでDebug.logで通っているか試して見てください。
通らなかったらシーンの名前の比較が上手くいっていないことになります。

c#

1 void Start() 2 { 3 //タイトルシーンが読み込まれた時の状態 4 TitleObject.SetActive(true); 5 HowToPlay.SetActive(false); 6 StageSelect.SetActive(false); 7 8 rb = GetComponent<Rigidbody2D>(); 9 10 //Easyを読み込んだ時のlife 11 if (SceneManager.GetActiveScene().name == "Easy") 12 { 13       Debug.log("Set Life"); 14 life = 5; 15 }

あとはリトライメソッドでライフを5にしてからシーンをロードしないとダメそうに見えます。

#region//リトライ public void RetryGame() { target1CountScore = 0; target2CountScore = 0; isClear = false; isGameover = false; if(SceneManager.GetActiveScene().name == "Easy") {        life = 5; LoadEasyScene(); }

投稿2020/10/25 05:56

newBee

総合スコア82

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

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

Aruku

2020/10/25 09:57

ご回答ありがとうございます。 まず、いきなりGameOverになってしまう件です、ライフの初期値を入れてみたところ、無事GameOverにならずシーン遷移ができました!ありがとうございました。 次に、if (SceneManager.GetActiveScene().name == "Easy")の分岐についてですが、上記の通り試してみたところ、TitleScene→Easyに切り替わるときに、Debug.Logが表示されておりませんでした。 また、リトライメソッド中で、ライフを入れてみたのですが、状況に変化は見られませんでした。 質問への情報追記、修正にも書きましたが、おそらくOnClickに入っているメソッドそのものが呼び出されていないようです。
newBee

2020/10/25 13:42 編集

Debug.logが表示されないのなら if(SceneManager.GetActiveScene().name == "Easy"){ //ここの処理が実行されていない // ここのLife設定やシーンロードの処理が実行されていない } のように見えます。 OnClickにメソッド設定されているのならメソッド自体は実行されているはずです。気になるならメソッドを違うものに変えて設定してためしてみてください。 public void ClickTest(){ Debug.log(" Click Test "); } あとEasyのみでテストしているのであればこの分岐は今は不要だと思うので すべてコメントアウトして試してみてはいかがでしょうか? (リトライメソッド) //Easyを読み込んだ時のlife if(SceneManager.GetActiveScene().name == "Easy") {    life = 5; LoadEasyScene(); } 上記を以下だけのコードにして試してみてください。  life = 5; LoadEasyScene(); 他にも  if (SceneManager.GetActiveScene().name == "Easy") を記述している部分があるので全て同様に。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問