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

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

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

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

Unity

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

Q&A

解決済

2回答

4895閲覧

Unity 今のステージをクリアしたら次のステージを開放したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/09/12 05:16

編集2021/09/12 08:48

前提・実現したいこと

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ボタンは移動してくれませんでした。なので、スクリプトのどこかの部分の考え方が間違っていると思われますが、未だ原因が分からずにいます。

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

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

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

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

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

mimi_no_naka

2021/09/12 10:31 編集

・if(clearstage == 1)の条件式が実行出来ていないのか ・条件式内の移動が出来ていない 上記どちらが問題なのかまずは切り分けて下さい
退会済みユーザー

退会済みユーザー

2021/09/12 13:59

デバッグの結果、if(clearstage == 1)の条件式がそもそも実行出来ていない、ということでした。
mimi_no_naka

2021/09/12 15:30 編集

切り分けしてくれたので修正点書くと clearstageがシーン切り替えで保存されてない事とStart関数内で常に0にされる事が問題です ・「public int clearstage;→public static int clearstage;」に書き変える ・Start関数内の「clearstage = 0;」を削除 上記二つで条件式は実行される様な気がするので試して下さい
退会済みユーザー

退会済みユーザー

2021/09/13 00:32 編集

・「public int clearstage;→public static int clearstage;」に書き変える ・Start関数内の「clearstage = 0;」を削除 この2つをやって再度デバッグで確かめましたが、やはりif(clearstage == 1)の条件式が実行できませんでした。 試しにStageNumもstaticにしましたが駄目でした。また、SceneManager.LoadScene("ClearScene");でシーン遷移後、「セレクト画面に戻る」ボタンを押したタイミングでstage1start = false;としていることが原因かなと思い、削除してデバッグしましたが、それも駄目でした。
mimi_no_naka

2021/09/13 05:35 編集

デバッグをどうおこなっているのか不明なのですがデバッガーを使って値を確認するなどもう少し正確におこなって下さい >再度デバッグで確かめましたが、やはりif(clearstage == 1) 確かめたのならばどこで処理が止まって何が原因でこの条件式が実行されないのか判る筈なのでそれも記載して下さい 現状の乱雑なままやっていれば延々と同じ事繰り返すだけかと思います
退会済みユーザー

退会済みユーザー

2021/09/13 11:01

デバッグを細かく行うことで原因が分かり、自己解決に至りました。別のシーンに存在するUI(ボタン)の座標を取得し、動かそうとしたことが原因だったようです。Start()の「clearstage = 0;」は削除しなくても動作上特に問題なかったので、削除せず残しておくことにしました。 親切に回答してもらい、ありがとうございました。
mimi_no_naka

2021/09/13 14:00

それは質問文やコードからは気付けないのでやはり自身でデバッグして確認して貰わないと判らないですね ちょっと厳しい事言ってしまったかなと思いましたがキチンとおこなってくれる方で良かったです
guest

回答2

0

ベストアンサー

デバッグした結果、他のシーンに存在するUI(ボタン)の座標を取得し、動かそうとしていたことが原因だったようです。

投稿2021/09/13 10:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

問題は単純に「UI をスクリプトから座標指定で移動させたい」ということですね。

そのために localPosition (Transform から継承した変数)を操作していますが、UI を動かすには RectTransform.anchoredPosition を操作します。

追記

いきなり自分が作っているコードを書き変えてみるのではなく、「UI を動かすには RectTransform.anchoredPosition を使う」ということ、それだけ確認するという事をした方がよいですよ。

c#

1using UnityEngine; 2 3public class MoveUI : MonoBehaviour 4{ 5 [SerializeField] RectTransform m_ui = default; 6 7 public void Move() 8 { 9 Vector2 pos = new Vector2(Random.Range(-200f, 200f), Random.Range(-200f, 200f)); 10 Debug.Log(pos.ToString()); 11 m_ui.anchoredPosition = pos; 12 } 13}

動いている様子
イメージ説明

投稿2021/09/12 07:35

編集2021/09/12 10:10
bboydaisuke

総合スコア5308

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

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

退会済みユーザー

退会済みユーザー

2021/09/12 08:51

アドバイス頂いたとおりにスクリプトを変更したのですが、やはりUIボタンは移動しませんでした。なので、スクリプトのどこかの考え方に誤りがあるせいかもしれません。
mimi_no_naka

2021/09/12 10:44 編集

移動の方だけ無くフラグの方も駄目で条件式が実行出来てない事も指摘してあげて下さい と言いますか、元のコードでも移動しない事は無いのでフラグの問題だけ修正で良いかもしれません
bboydaisuke

2021/09/12 10:45

正直貼られているコードは読むのが辛くてフラグ云々の所までは読み取れませんでした。その処理が実行できてる・できてないくらいはログを出力して確認くらいはして欲しい、と期待しています。
退会済みユーザー

退会済みユーザー

2021/09/12 11:06

デバッグの結果、if(clearstage == 1)の条件式が実行出来ていない、というのが現状です。なので、UIの移動以前の問題でした。最初にデバッグしておくべきでした、、、申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問