前提・実現したいこと
Unityで2Dゲームを製作中で、実現したいことは2つです。
1.今のステージをクリアしたら次のステージが始まるボタンを押せるようにしたい(SetActiveではなく、ステージのボタンをStart()でGame画面外にセットし、例えばステージ1をクリアしたらステージ2のボタンがGame画面内の特定の座標に移動してくる、という方法を取っています)。
2.ステージ2開放後にもう一度ステージ1でプレイし、ゲームオーバーになっても、ステージ2のボタンは押せる状態に保ちたいです。
発生している問題・エラーメッセージ
エラー表示は特になし。
該当のソースコード
1.例えばステージ1のボタンを押すと、ステージ1ボタンにアタッチしたスクリプトのstage1startのboolがtrueになり、ステージ1用の敵が配置されます。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6public class Stage1button : MonoBehaviour 7{ 8 public static bool stage1start; 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 stage1start = false; 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 20 } 21 22 public void Stage1Push() 23 { 24 stage1start = true; 25 SceneManager.LoadScene("SampleScene"); 26 } 27}
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6public class Stagemanager : MonoBehaviour 7{ 8 [SerializeField] GameObject randomenemy; 9 [SerializeField] GameObject enemy1; 10 [SerializeField] GameObject enemy2; 11 [SerializeField] GameObject enemy3; 12 13 public GameObject stage1button; 14 public GameObject stage2button; 15 public GameObject stage3button; 16 17 18 public int randomenemynum; 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 stage1button = GameObject.Find("bluebutton1"); 24 stage2button = GameObject.Find("bluebutton2"); 25 stage3button = GameObject.Find("bluebutton3"); 26 27 28 if (Stage1button.stage1start == true) 29 { 30 Debug.Log("ステージ1の敵をセッティング"); 31 32 //ステージ1用の敵集団呼び出しboolをUpdate()に書こう 33 34 Instantiate(enemy1, new Vector3(3.4f, -0.14f, 0), Quaternion.identity); 35 StartCoroutine("stage1Count"); 36 } 37 38 39 if (Stage2button.stage2start == true) 40 { 41 Debug.Log("ステージ2の敵をセッティング"); 42 //ここはboolの呼び出しクリア。 43 //ステージ1用の敵集団呼び出しboolをUpdate()に書こう 44 45 46 Instantiate(enemy2, new Vector3(3.4f, -0.14f, 0), Quaternion.identity); 47 StartCoroutine("stage2Count"); 48 } 49 50 51 if (Stage3button.stage3start == true) 52 { 53 Debug.Log("ステージ3の敵をセッティング"); 54 //ここはboolの呼び出しクリア。 55 //ステージ1用の敵集団呼び出しboolをUpdate()に書こう 56 57 58 Instantiate(enemy3, new Vector3(3.4f, -0.14f, 0), Quaternion.identity); 59 StartCoroutine("stage3Count"); 60 } 61 } 62 63 64 void Update() 65 { 66 randomenemynum = Random.Range(1, 4); 67 68 if(randomenemynum == 1) 69 { 70 randomenemy = enemy1; 71 } 72 73 if (randomenemynum == 2) 74 { 75 randomenemy = enemy2; 76 } 77 78 if (randomenemynum == 3) 79 { 80 randomenemy = enemy3; 81 } 82 } 83 84 85 IEnumerator stage1Count() 86 { 87 for (int count = 0; count < 1; count++) 88 { 89 yield return new WaitForSeconds(15.0f); 90 Instantiate(randomenemy, new Vector3(3.4f, -0.14f, 0), Quaternion.identity); 91 } 92 } 93 94 IEnumerator stage2Count() 95 { 96 for (int count = 0; count < 5; count++) 97 { 98 yield return new WaitForSeconds(5.0f); 99 Instantiate(randomenemy, new Vector3(3.57f, 0, 0), Quaternion.identity); 100 } 101 } 102 103 IEnumerator stage3Count() 104 { 105 for (int count = 0; count < 5; count++) 106 { 107 yield return new WaitForSeconds(5.0f); 108 Instantiate(randomenemy, new Vector3(3.57f, 0, 0), Quaternion.identity); 109 } 110 } 111}
2.もしクリアしたら、次のスクリプトの処理でクリア画面へシーン遷移します。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class NumberController : MonoBehaviour 8{ 9 public Text rightnum; 10 public Text leftnum; 11 12 13 public int rightnumrandom; 14 public int leftnumrandom; 15 public int rightnumrandomnew; 16 public int leftnumrandomnew; 17 public int enemycount; 18 19 public int clearstage; 20 public int StageNum; 21 22 public bool[] rightarea = new bool[9]; 23 public bool[] leftarea = new bool[9]; 24 public static bool stage1clear; 25 26 27 public GameObject stage1button; 28 public GameObject stage2button; 29 public GameObject stage3button; 30 31 // Start is called before the first frame update 32 void Start() 33 { 34 for (int i = 0; i <= 8; i++) 35 { 36 rightarea[i] = false; 37 } 38 39 for (int i = 0; i <= 8; i++) 40 { 41 leftarea[i] = false; 42 } 43 44 45 rightnumrandomnew = Random.Range(1, 10); 46 //rightnumrandom = 1; 47 this.rightnum = GameObject.Find("RightNumText").GetComponent<Text>(); 48 rightnum.text = rightnumrandomnew.ToString(); 49 50 leftnumrandomnew = Random.Range(1, 10); 51 //leftnumrandom = 1; 52 this.leftnum = GameObject.Find("LeftNumText").GetComponent<Text>(); 53 leftnum.text = leftnumrandomnew.ToString(); 54 55 56 57 enemycount = 0; 58 59 stage1button = GameObject.Find("bluebutton1"); 60 stage1button = GameObject.Find("bluebutton2"); 61 stage3button = GameObject.Find("bluebutton3"); 62 63 //stage1clear = false; 64 65 clearstage = 0; 66 } 67 68 // Update is called once per frame 69 void Update() 70 { 71 if (rightnumrandomnew == 1) 72 { 73 rightarea[0] = true; 74 75 } 76 77 if (rightnumrandomnew == 2) 78 { 79 rightarea[1] = true; 80 81 } 82 83 ・・・ 84 85 if (rightnumrandomnew == 9) 86 { 87 rightarea[8] = true; 88 89 } 90 91 92 93 if (leftnumrandomnew == 1) 94 { 95 leftarea[0] = true; 96 97 } 98 99 if (leftnumrandomnew == 2) 100 { 101 leftarea[1] = true; 102 103 } 104 105 ・・・ 106 107 if (leftnumrandomnew == 9) 108 { 109 leftarea[8] = true; 110 111 } 112 113 114 if (Stage1button.stage1start == true) 115 { 116 if (enemycount == 2) 117 { 118 StageNum = 1; 119 120 if (clearstage < StageNum) 121 { 122 clearstage = StageNum; 123 } 124 125 //stage1clear = true; 126 SceneManager.LoadScene("ClearScene"); 127 128 } 129 } 130 131 132 if(clearstage == 1) 133 { 134 RectTransform rectTransformbutton2 = stage2button.GetComponent<RectTransform>(); 135 rectTransformbutton2.localPosition = new Vector3(-82, 525.6f, -11520); 136 } 137 } 138 139 public void OnTriggerEnter2D(Collider2D other) 140 { 141 142 143 ++enemycount; 144 145 Resetrandomnum(); 146 } 147 148 149 public void Resetrandomnum() 150 { 151 for (int i = 0; i <= 8; i++) 152 { 153 rightarea[i] = false; 154 } 155 156 for (int i = 0; i <= 8; i++) 157 { 158 leftarea[i] = false; 159 } 160 161 rightnumrandomnew = Random.Range(1, 10); 162 this.rightnum = GameObject.Find("RightNumText").GetComponent<Text>(); 163 rightnum.text = rightnumrandomnew.ToString(); 164 165 166 leftnumrandomnew = Random.Range(1, 10); 167 this.leftnum = GameObject.Find("LeftNumText").GetComponent<Text>(); 168 leftnum.text = leftnumrandomnew.ToString(); 169 170 171 if (rightnumrandomnew == 1) 172 { 173 rightarea[0] = true; 174 } 175 176 if (rightnumrandomnew == 2) 177 { 178 rightarea[1] = true; 179 180 } 181 182 ・・・ 183 184 if (rightnumrandomnew == 9) 185 { 186 rightarea[8] = true; 187 188 } 189 190 191 192 if (leftnumrandomnew == 1) 193 { 194 leftarea[0] = true; 195 196 } 197 198 if (leftnumrandomnew == 2) 199 { 200 leftarea[1] = true; 201 202 } 203 204 ・・・ 205 206 if (leftnumrandomnew == 9) 207 { 208 leftarea[8] = true; 209 210 } 211 212 } 213}
if(clearstage == 1){}の部分でステージ2のボタンの座標を取得し、ゲーム画面内に出現させたいのですが、指定した座標にボタンが移動しないのが現状です。なので、「クリアしたステージの、次のステージボタンがゲーム画面内に移動してくれたら成功」です。
試したこと
本サイトで過去に似たような質問があったので参考にしました。int型のClearstageとStageNum(クリアしたステージの番号)を定義し、Clearstage < StageNumならばClearstage = StageNumを活用したつもりですが、うまく行きませんでした。
追記
C#
1if(clearstage == 1) 2 { 3 RectTransform rectTransformbutton2 = stage2button.GetComponent<RectTransform>(); 4 rectTransformbutton2.localPosition = new Vector3(-82, 525.6f, -11520); 5 }
としていたスクリプトを、
C#
1if(clearstage == 1) 2 { 3 RectTransform rectTransformbutton2 = stage2button.GetComponent<RectTransform>(); 4 rectTransformbutton2.anchoredPosition = new Vector2(-82, 525.6f); 5 }
に変更してみたのですが、やはりUIボタンは移動してくれませんでした。なので、スクリプトのどこかの部分の考え方が間違っていると思われますが、未だ原因が分からずにいます。
回答2件
あなたの回答
tips
プレビュー