こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119
★★★★★随時更新★★★★★
2022.11.22追記
20022.11.29追記
★★★★★★★★★★★★★★★
(見本)Board.cs
//ブロックが枠内にあるのか判定する関数を呼ぶ関数
public bool CheckPosition(Block block)
{
foreach (Transform item in block.transform)
{
Vector2 pos = new Vector2(Mathf.Round(item.position.x),Mathf.Round(item.position.y));
if(!BoardOutCheck((int)pos.x, (int)pos.y))
{
return false;
}
if (BlockCheck((int)pos.x, (int)pos.y,block))
{
return false;
}
}
return true;
}
//枠内にあるか判定する関数
bool BoardOutCheck(int x, int y)
{
//x軸は0以上with未満 z軸は0以上
return (x >= 0 && x < width && y >= 0);
}
解説
【(関数)ブロックが枠内にあるのか判定する関数を呼ぶ】
①public bool CheckPosition(Block block)
{
②foreach (Transform item in block.transform)
{
③Vector2 pos = new Vector2(Mathf.Round(item.position.x),Mathf.Round(item.position.y));
④if(!BoardOutCheck((int)pos.x, (int)pos.y))
{
⑤return false;
}
}
⑥return true;
}
①外から呼び出し可能、
ブロックが枠内にあるのか判定する関数を呼ぶ=CheckPositionとする
引数にブロックを渡す、名前はblockとする
②Blockオブジェクトにはblockが7個(子を含む)がり、その数(transform)分だけ繰り返しループする
③変数宣言、Mathf.Round→丸める
itemのxy軸を丸めてpos変数に格納する
④blockが脇からはみ出ていないかの判定
もしBoardOutCheck(枠内にあるか判定する)があればtrue
!もしBoardOutCheckがなければtrue = 枠からはみ出ていたら
通常ブロックが枠内にあるのか判断→!がついている為、ブロックが枠内にないのか判断
⑤~~! false~~
ないなら、中処理へfalse(偽)を返す
⑥全部収まっていたらtrue
bool型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
Mathf.Roundとは
https://learn.microsoft.com/ja-jp/dotnet/api/system.math.round?view=net-7.0
foreach
https://qiita.com/hanatan079/items/9c29d7ab61729177cbe3
【(関数)枠内にあるか判定する】
①bool BoardOutCheck(int x, int y)
{
②return (x >= 0 && x < width && y >= 0);
}
①bool型、 BoardOutCheck(枠内にあるか判定する)、
②x軸は0以上with未満であり、 y軸は0以上であること。全て条件が成立していればtrue
bool,int型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
演算子について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f
GameManeger.cs
//ボードのスクリプトを格納
①Board board;
//ボードを変数に格納(スタート)
②board = GameObject.FindObjectOfType<Board>();
//Boardクラスの関数を呼び出してボードからはみ出ていないか確認(アップデート)
③if (!board.CheckPosition(activeBlock))
{
⑥activeBlock.MoveUp();
⑦activeBlock = spawner.SpawnBlock();
}
①Board型 名前board
②全てのオブジェクトからBoardコンポーネントを探してboard変数へ格納する
FindObjectOfTypeは全てのコンポーネントの中から<>を探すため重い処理。乱用注意。
③もしactiveBlockがはみ出ていなかったら。
!否定false(偽)の時に中に入る。
すなわち、もしactiveBlockがはみ出ていたら。
⑥MoveUp=一つ上に戻る。→下にはみでたら上に戻す=枠からはみ出なくなる。
⑦新しいブロックを生成してactiveBlockに格納する
①〜⑦activeBlockがはみ出たら、1つ上に戻してね。
そしたら下にブロックが着いたから次の新しいブロックをactiveBlock内に生成してね。
if文、!否定について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f