すみませんが質問させてください。
現在私は横10×縦8のカードを生成して、カーソルを合わせたカードと隣接している同じ色のカードを選択する、いわゆるさめがめ系の開発を試みています。
しかし下の方に書いてあるdo~while文を追加したところ、カーソルをカードに合わせた途端にUnityがフリーズしてしまいまして、動かなくなってしまう現象が発生しました。
do~while文の内部で無限ループにでも入っているのではないかと考えられるのですがどうしても原因や解決策が見出せません。
do~while文の中で行いたい内容は、カーソルを合わせたカードの上下左右に同じ色のカードが存在した場合、更にそこから上下左右にチェックして同じ色のカードが無いかを探しに行く事です。
もしよろしければどなたかご教授願えませんでしょうか?
よろしくお願いします。
実装したい内容
http://www.afsgames.com/samegame.htm
(現在は隣接している同じ色のカードが無くても色が変わってしまいますが、そこは後ほど修正します)
使用環境:Unity5.5.1、Visual Studio 2015
Unity
1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class MainScripts : MonoBehaviour { 8 9 public GameObject[] BoxPrefab = new GameObject[6]; //生成するBox 10 public GameObject obj; //カーソルを合わせたオブジェクト 11 12 public bool cursor = false; //カーソルを合わせてチェックを行う判定 13 public bool check = false; //隣接しているカードがあるかどうかの判定 14 public bool changecolor = false; //隣接しているパネルが存在し、色を変えるかどうかの判定 15 16 public int[,] boxTBL = new int[10,8]; //横10*縦8のカードを生成する配列 17 public int[,] checkTBL = new int[10, 8]; //横10*縦8の同じカードが並んでいるかのチェックを入れる配列 18 public int idx; //カーソルを合わせたカードのx座標を代入 19 public int idy; //カーソルを合わせたカードのy座標を代入 20 public int color; //色番号を格納する 21 22 public string objname = ""; //オブジェクト名を格納する場所 23 24 /* 25 //横10*縦8のBoxを生成する配列 26 public int[,] boxTBL = new int[,] { 27 {0,0,0,0,0,0,0,0,0,0}, 28 {0,0,0,0,0,0,0,0,0,0}, 29 {0,0,0,0,0,0,0,0,0,0}, 30 {0,0,0,0,0,0,0,0,0,0}, 31 {0,0,0,0,0,0,0,0,0,0}, 32 {0,0,0,0,0,0,0,0,0,0}, 33 {0,0,0,0,0,0,0,0,0,0}, 34 {0,0,0,0,0,0,0,0,0,0} 35 }; 36 */ 37 38 39 // Use this for initialization 40 void Start () { 41 //起動時にはカーソルは合わせていないので偽とする 42 cursor = false; 43 //起動時には隣接しているカードの判定は偽とする 44 check = false; 45 //隣接しているカードの判定は偽とする 46 changecolor = false; 47 //カードをx軸0、y軸0から順番に生成する 48 //生成されるカードのy座標はマイナスなので注意…0→-1→-2...etc 49 for (int idy = 0; idy < 8; idy++) { 50 for (int idx = 0; idx < 10; idx++) { 51 //1番から5番のカードをランダムで選択する 52 boxTBL[idx, idy] = Random.Range(1, 6); 53 //idy.idx座標の場所を選択する 54 int R = boxTBL[idx, idy]; 55 //座標の値が0で無ければ 56 if (boxTBL[idx, idy] != 0) { 57 //idx.idyの座標に(y軸はマイナス) 58 Vector2 pos = new Vector2(idx, -idy); 59 //オブジェクトをインスタンス生成する 60 GameObject buller = Instantiate(BoxPrefab[R - 1], pos, Quaternion.identity); 61 //インスタンス生成されたオブジェクトに座標を入れた名前に変更する 62 buller.name = "Card_x" + idx + "_y" +idy; 63 } 64 } 65 } 66 } 67 68 // Update is called once per frame 69 void Update () { 70 //GameDateからカーソルが入っているかを常にチェック 71 cursor = GameData.Cursor; 72 //カードにカーソルが合わさった時 73 if (cursor) { 74 //オブジェクトのx座標を取得 75 idx = (int)GameData.Pointx; 76 //オブジェクトのy座標を取得 77 idy = (int)(Mathf.Abs(GameData.Pointy)); 78 //座標を取得したのでGameDateの判定を偽にする 79 GameData.Cursor = false; 80 //オブジェクト名を登録する 81 objname = "Card_x" + idx + "_y" + idy; 82 //登録したオブジェクト名のオブジェクトを探す 83 GameObject obj = GameObject.Find(objname); 84 //見つかったオブジェクトの色を黒にする 85 obj.GetComponent<Renderer>().material.color = Color.black; 86 //座標の場所にフラグを立てる 87 checkTBL[idx, idy] = 1; 88 //隣接しているカードが同じかどうかのチェック 89 CardCheck(); 90 //座標チェックフラグを偽にする 91 cursor = false; 92 } 93 } 94 95 //隣接している同じ色のカードをまとめてチェックする項目 96 void CardCheck() { 97 //選択したカードの色を格納する 98 color = boxTBL[idx, idy]; 99 //x座標が1以上の場合 100 if (idx > 0) { 101 //左隣のカードの色が同じ場合 102 if (boxTBL[idx, idy] == boxTBL[idx - 1, idy]) { 103 //左隣が同じフラグを立てる 104 checkTBL[idx - 1, idy] = 1; 105 //隣接しているカードが存在するフラグを立てる 106 changecolor = true; 107 } 108 } 109 //x座標が8以下の場合 110 if (idx < 9) { 111 //右隣のカードの色が同じ場合 112 if (boxTBL[idx, idy] == boxTBL[idx + 1, idy]) { 113 //右隣が同じフラグを立てる 114 checkTBL[idx + 1, idy] = 1; 115 //隣接しているカードが存在するフラグを立てる 116 changecolor = true; 117 } 118 } 119 120 //y座標が1以上の場合 121 if (idy > 0) { 122 //上隣のカードの色が同じ場合 123 if (boxTBL[idx, idy] == boxTBL[idx , idy-1]) { 124 //上隣が同じフラグを立てる 125 checkTBL[idx, idy-1] = 1; 126 //隣接しているカードが存在するフラグを立てる 127 changecolor = true; 128 } 129 } 130 //y座標が6以下の場合 131 if (idy < 7) { 132 //下隣のカードの色が同じ場合 133 if (boxTBL[idx, idy] == boxTBL[idx, idy + 1]) { 134 //下隣が同じフラグを立てる 135 checkTBL[idx, idy + 1] = 1; 136 //隣接しているカードが存在するフラグを立てる 137 changecolor = true; 138 } 139 } 140 //更に隣接しているカードがあるかのチェック 141 do { 142 check = false; 143 for (int idy = 0; idy < 8; idy++) { 144 for (int idx = 0; idx < 10; idx++) { 145 if (checkTBL[idx, idy] == 1) { 146 //x座標が1以上の場合 147 if (idx > 0) { 148 //左隣のカードの色が同じ場合 149 if (boxTBL[idx, idy] == boxTBL[idx - 1, idy]) { 150 //左隣が同じフラグを立てる 151 checkTBL[idx - 1, idy] = 1; 152 check = true; 153 } 154 } 155 //x座標が8以下の場合 156 if (idx < 9) { 157 //右隣のカードの色が同じ場合 158 if (boxTBL[idx, idy] == boxTBL[idx + 1, idy]) { 159 //右隣が同じフラグを立てる 160 checkTBL[idx + 1, idy] = 1; 161 check = true; 162 } 163 } 164 //y座標が1以上の場合 165 if (idy > 0) { 166 //上隣のカードの色が同じ場合 167 if (boxTBL[idx, idy] == boxTBL[idx, idy - 1]) { 168 //上隣が同じフラグを立てる 169 checkTBL[idx, idy - 1] = 1; 170 check = true; 171 } 172 } 173 //y座標が6以下の場合 174 if (idy < 7) { 175 //下隣のカードの色が同じ場合 176 if (boxTBL[idx, idy] == boxTBL[idx, idy + 1]) { 177 //下隣が同じフラグを立てる 178 checkTBL[idx, idy + 1] = 1; 179 check = true; 180 } 181 } 182 } 183 } 184 } 185 } while (check); 186 187 188 for (int idy = 0; idy < 8; idy++) { 189 for (int idx = 0; idx < 10; idx++) { 190 if (checkTBL[idx, idy] <= 1) { 191 192 //オブジェクト名を登録する 193 objname = "Card_x" + idx + "_y" + idy; 194 //登録したオブジェクト名のオブジェクトを探す 195 GameObject obj = GameObject.Find(objname); 196 //見つかったオブジェクトの色を黒にする 197 obj.GetComponent<Renderer>().material.color = Color.black; 198 199 } 200 } 201 } 202 } 203} 204 205
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/29 04:25