前提・実現したいこと
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なら新たに決めた乱数を代入する、というふうにしましたが、それでも更新前後の乱数が反映されてしまいます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/09/12 03:12
2021/09/12 06:25
退会済みユーザー
2021/09/12 07:19