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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Unity

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

Q&A

解決済

1回答

1135閲覧

Unity for文ループで変数の更新後にも更新前の内容も引き継がれるのを解決したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Unity

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

0グッド

0クリップ

投稿2021/09/11 12:26

前提・実現したいこと

Unityで2Dゲームの開発中です。やりたいことが少々複雑なので、順を追って説明します。
<前提>
2次元平面の原点を中心とし、y軸からみて対象に左右に9個ずつ全部で18個の箱があると仮定してください。(左9, 左8, 左7, 左6, ・・・右8, 右9)

<実現したいこと>
1.2つの乱数をStart()で決めます(例, 右7, 左3)。
2.右7, 左3であれば、18個の箱のうち右7, 左3の箱に対して仕掛けたbool(rightarea[6],rightarea[2])がtrueになります。

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 20 public bool[] rightarea = new bool[9]; 21 public bool[] leftarea = new bool[9]; 22 public static bool stage1clear; 23 24 public GameObject stage1button; 25 public GameObject stage2button; 26 public GameObject stage3button; 27 28 29 30 // Start is called before the first frame update 31 void Start() 32 { 33 for (int i = 0; i <= 8; i++) 34 { 35 rightarea[i] = false; 36 } 37 38 for (int i = 0; i <= 8; i++) 39 { 40 leftarea[i] = false; 41 } 42 43 44 rightnumrandom = Random.Range(1, 10); 45 //rightnumrandom = 1; 46 this.rightnum = GameObject.Find("RightNumText").GetComponent<Text>(); 47 rightnum.text = rightnumrandom.ToString(); 48 49 leftnumrandom = Random.Range(1, 10); 50 //leftnumrandom = 1; 51 this.leftnum = GameObject.Find("LeftNumText").GetComponent<Text>(); 52 leftnum.text = leftnumrandom.ToString(); 53 54 55 enemycount = 0; 56 57 stage1button = GameObject.Find("bluebutton1"); 58 stage2button = GameObject.Find("bluebutton2"); 59 stage3button = GameObject.Find("bluebutton3"); 60 61 62 63 64 65 stage1clear = false; 66 67 68 69 70 } 71 72 // Update is called once per frame 73 void Update() 74 { 75 76 rightnumrandomnew = rightnumrandom; 77 leftnumrandomnew = leftnumrandom; 78 79 80 81 if (rightnumrandomnew == 1) 82 { 83 rightarea[0] = true; 84 85 } 86 87 if (rightnumrandomnew == 2) 88 { 89 rightarea[1] = true; 90 91 } 92 93 if (rightnumrandomnew == 3) 94 { 95 rightarea[2] = true; 96 97 } 98 99 if (rightnumrandomnew == 4) 100 { 101 rightarea[3] = true; 102 103 } 104 105 if (rightnumrandomnew == 5) 106 { 107 rightarea[4] = true; 108 109 } 110 111 if (rightnumrandomnew == 6) 112 { 113 rightarea[5] = true; 114 115 } 116 117 if (rightnumrandomnew == 7) 118 { 119 rightarea[6] = true; 120 121 } 122 123 if (rightnumrandomnew == 8) 124 { 125 rightarea[7] = true; 126 127 } 128 129 if (rightnumrandomnew == 9) 130 { 131 rightarea[8] = true; 132 133 } 134 135 136 137 if (leftnumrandomnew == 1) 138 { 139 leftarea[0] = true; 140 141 } 142 143 if (leftnumrandomnew == 2) 144 { 145 leftarea[1] = true; 146 147 } 148 149 if (leftnumrandomnew == 3) 150 { 151 leftarea[2] = true; 152 153 } 154 155 if (leftnumrandomnew == 4) 156 { 157 leftarea[3] = true; 158 159 } 160 161 if (leftnumrandomnew == 5) 162 { 163 leftarea[4] = true; 164 165 } 166 167 if (leftnumrandomnew == 6) 168 { 169 leftarea[5] = true; 170 171 } 172 173 if (leftnumrandomnew == 7) 174 { 175 leftarea[6] = true; 176 177 } 178 179 if (leftnumrandomnew == 8) 180 { 181 leftarea[7] = true; 182 183 } 184 185 if (leftnumrandomnew == 9) 186 { 187 leftarea[8] = true; 188 189 } 190 191 192 193 194 } 195 196 public void OnTriggerEnter2D(Collider2D other) 197 { 198 199 Debug.Log("クリア"); 200 201 rightnumrandomnew = Random.Range(1, 10); 202 this.rightnum = GameObject.Find("RightNumText").GetComponent<Text>(); 203 rightnum.text = rightnumrandomnew.ToString(); 204 205 206 207 leftnumrandomnew = Random.Range(1, 10); 208 this.leftnum = GameObject.Find("LeftNumText").GetComponent<Text>(); 209 leftnum.text = leftnumrandomnew.ToString(); 210 211 212 ++enemycount; 213 } 214}

3.別スクリプトのfor文にて、次のような処理を行います。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerManager : MonoBehaviour 6{ 7 public GameObject migimigiba; 8 public GameObject hidarihidariba; 9 10 11 public GameObject a; 12 public GameObject b; 13 14 public bool gameoverflag; 15 public bool flag; 16 17 void Start() 18 { 19 migimigiba = GameObject.Find("migiba"); 20 hidarihidariba = GameObject.Find("hidariba"); 21 22 23 24 a = GameObject.Find("A"); 25 b = GameObject.Find("B"); 26 27 28 29 } 30 31 // Update is called once per frame 32 void Update() 33 { 34 35 flag = false; 36 37 for (int i = 0; i <= 8; i++) 38 { 39 for (int j = 0; j <= 8; j++) 40 { 41 if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == true 42 && hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == true) 43 { 44 flag = true; 45 } 46 } 47 } 48 49 if (flag) 50 { 51 52 a.transform.position = new Vector3(-7.28f, 5.04f, 0); 53 b.transform.position = new Vector3(-1.65f, 0.03f, 0); 54 55 56 } 57 else 58 { 59 a.transform.position = new Vector3(-1.63f, -0.19f, 0); 60 b.transform.position = new Vector3(-12.25f, 4.45f, 0); 61 } 62 } 63 64 65}

4.3までの内容がタイトルでいう更新前の内容です。次に、最初に示したスクリプトの以下の部分で、数字の切り替え判定用オブジェクトに接触すると新たに乱数が定義され、同スクリプトのUpdate()でleftnumrandomnewとleftnumrandomnewに新しく決めた乱数の値を代入します(この状態が更新後)。更新後の乱数を元にfor文で処理を行ったのですが、更新前の乱数と更新後の乱数のどちらでも処理が実行されてしまいます。

ゆえに、「更新後の乱数でのみ処理が実行されるようにしたい」というのが目的です。なお、左右の乱数は1回だけではなく何度も変化する仕様にする予定です。

C#

1public void OnTriggerEnter2D(Collider2D other) 2 { 3 4 Debug.Log("クリア"); 5 6 rightnumrandomnew = Random.Range(1, 10); 7 this.rightnum = GameObject.Find("RightNumText").GetComponent<Text>(); 8 rightnum.text = rightnumrandomnew.ToString(); 9 10 11 12 leftnumrandomnew = Random.Range(1, 10); 13 this.leftnum = GameObject.Find("LeftNumText").GetComponent<Text>(); 14 leftnum.text = leftnumrandomnew.ToString(); 15 16 //数字自体は左右ともに変化してくれます。 17 ++enemycount; 18 19 }

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

エラー表示なし。

試したこと

NumberControllerの処理に問題があると思い、```C#
public void OnTriggerEnter2D(Collider2D other)

内にboolを設置し、それがfalseならrightnumrandomnewにStart()で決めた最初の乱数を代入し、trueなら新たに決めた乱数を代入する、というふうにしましたが、それでも更新前後の乱数が反映されてしまいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

現状Update

C#

1 rightnumrandomnew = rightnumrandom; 2 leftnumrandomnew = leftnumrandom;

としています。
OnTriggerEnter2Dではrightnumrandomnew,leftnumrandomnewに値をセットしています。
bool配列のクリア処理もないので選択されたらされっぱなしでしょう。

最初と同じ処理を行うのですから乱数を生成してboolの配列の値をセット・リセットするメソッドを作って、それを行うべきタイミングで呼べばいいのではないでしょうか
Updateにて毎フレームbool配列にセットする必要もないですし。

投稿2021/09/11 23:13

編集2021/09/11 23:15
YAmaGNZ

総合スコア10489

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

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

退会済みユーザー

退会済みユーザー

2021/09/12 03:12

回答いただきありがとうございました。配列を初期化するメソッドをつくり、OnTriggerEnter2D内でそのメソッドを呼び出すことで解決しました。
YAmaGNZ

2021/09/12 06:25

Start内でもそのメソッドを呼び出すようにしないと同じ処理が結局2か所で行われることになるのでメソッドを作成した意味はなくなります。 その部分を仕様変更で修正しなくてはならない場合、同じ処理が分散していたら修正忘れによる障害があったりしますしね
退会済みユーザー

退会済みユーザー

2021/09/12 07:19

アドバイス頂いた通りで、うまく処理が実行されました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問