いつも大変お世話になっております。
落ちモノパズルを作成していています。
以下のプログラムはミノ回転時に縦、横の壁を貫通しないように座標を戻す処理とその座標にミノがある場合は逆回転させて元に戻す処理(回転させない)を行おうとしています。
壁を貫通しない処理はできているのですが、回転させない処理を入れるとなぜか壁を貫通するようになってしまいます。
回転させないの内容は各ブロックの現在の座標位置にミノがある場合はfalseを、ない場合はtrueを返すだけなので、何かの値を変えるという処理は行っていません。なぜこのような現象が起こるのか教えていただけると幸いです。
試したこと
処理順番を縦方向の防止、横方向、回転させないにすると壁は貫通しないが、ミノを貫通するので動いてない。
//回転させない を消せば壁は貫通しない→回転させないのせいでおかしくなったと予想。
//回転させない の中の処理をコメントアウトしても壁は貫通する。
C#
1 if (Input.GetKeyDown(KeyCode.A)) 2 { 3 transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), 90); 4 5 6 //縦方向の防止 7 if (!SideCheck()) 8 { 9 transform.position += new Vector3(0, 1, 0); 10 } 11 12 //回転させない 13 if (!Table_Check()) 14 { 15 transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), -90); 16 } 17 18 //横方向 19 if (!SideCheck() && Vel_Check()) 20 { 21 transform.position += new Vector3(1, 0, 0); 22 23 if (!SideCheck() && Vel_Check()) 24 { 25 transform.position += new Vector3(1, 0, 0); 26 } 27 } 28 29 if (!SideCheck() && !Vel_Check()) 30 { 31 transform.position += new Vector3(-1, 0, 0); 32 33 if (!SideCheck() && !Vel_Check()) 34 { 35 transform.position += new Vector3(-1, 0, 0); 36 } 37 } 38 39 } 40 41 bool SideCheck() 42 { 43 foreach(Transform mino_Pos in transform) 44 { 45 //配列に正しく格納させるためにRoundToIntで四捨五入 46 int mino_X = Mathf.RoundToInt(mino_Pos.transform.position.x); 47 int mino_Y = Mathf.RoundToInt(mino_Pos.transform.position.y); 48 49 Vector2 mino_Vet = new Vector2(mino_X, mino_Y); 50 51 if (CheckInside(mino_Vet) == false) 52 { 53 return false; 54 } 55 } 56 57 return true; 58 } 59 60 //true : 配列は空 false : 配列に何かが格納されている を返す 61 bool Table_Check() 62 { 63 foreach (Transform mino_Pos in transform) 64 { 65 int mino_X = Mathf.RoundToInt(mino_Pos.transform.position.x); 66 int mino_Y = Mathf.RoundToInt(mino_Pos.transform.position.y); 67 68 if (mino_Table[mino_Y, mino_X] != null) 69 { 70 return false; 71 } 72 73 } 74 75 return true; 76 } 77 78 //ミノの現在位置をCheck true:内側 false:外側 79 bool CheckInside(Vector2 now_Pos) 80 { 81 return now_Pos.x > -1 && 82 now_Pos.x < 10 && 83 now_Pos.y > -1; 84 } 85 86 //true : 左回転 false : 右回転 87 bool Vel_Check() 88 { 89 foreach(Transform mino_Pos in transform) 90 { 91 Vector2 cuurent_Pos = mino_Pos.position; 92 if (!Vel(cuurent_Pos)==false) 93 { 94 return false; 95 } 96 } 97 return true; 98 } 99 //左右の判定 true : 右 false : 左 100 bool Vel(Vector2 now_Pos) 101 { 102 return now_Pos.x > 1; 103 }
あなたの回答
tips
プレビュー