閲覧いただきありがとうございます。
Unity初心者です。
ググってやってみたり、参考URLで確認したり、いろいろ試してみましたが解決できなかったので、質問いたしました。
初めての質問なので、説明不足などありましたらごめんなさい。
前提
・タイトルシーン
ボタン2つ設定しており、それぞれボタンを押すと、Canvasで作成した
・遊び方画面(HowToPlay) ・・・最初の画面(TitleObject)に戻るボタンを設置)
・難易度選択画面(StageSelect)・・・ 選択した難易度のシーンに移動するボタンと、最初の画面(TitleObject)に戻るボタンを設置
が表示されるようになっています。
・ゲームシーン(Easy)・・・現段階で作成した難易度はEasyのみとなっています。
クリアorゲームオーバーになると同じくCanvasで作成した
・クリア画面(ClearObject)・・・リトライするボタンとタイトルシーンに戻るボタンを設置)
・ゲームオーバー画面(GameOver)・・・リトライするボタンとタイトルシーンに戻るボタンを設置)
が表示されます。
実現したいこと
-
タイトルシーンの難易度選択をクリック → 難易度選択画面 → Easy → クリア画面 or ゲームオーバー画面 → タイトルシーン...
-
クリア画面 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使用
回答2件
あなたの回答
tips
プレビュー