こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119
★★★★★随時更新★★★★★
2022.11.22追記
20022.11.30追記
★★★★★★★★★★★★★★★
(見本)Board.cs
//2次元配列の作成
private Transform[,] grid;
//ブロックが枠内にあるのか判定する関数を呼ぶ関数
public bool CheckPosition(Block block)
{
foreach (Transform item in block.transform)
{
Vector2 pos = Rounding.Round(item.position);
if(!BoardOutCheck((int)pos.x, (int)pos.y))
{
return false;
}
//追記
if (BlockCheck((int)pos.x, (int)pos.y,block))
{
return false;
}
}
return true;
}
//移動先にブロックがないか判断する関数
bool BlockCheck(int x, int y,Block block)
{
return(grid[x,y] != null && grid[x,y].parent != block.transform);
}
//ブロックが落ちたポジションを記録する関数
public void SaveBlockInGrid(Block block)
{
foreach (Transform item in block.transform)
{
Vector2 pos = Rounding.Round(item.position);
grid[(int)pos.x, (int)pos.y] = item;
}
}
解説
【2次元配列の作成】
private Transform[,] grid;
宣言したモジュールの中でのみ、gridという名のTransform(2次元配列(x,y))を使用できるようにする
【移動先にブロックがある判断する関数】
//移動先にブロックがある判断する関数
①bool BlockCheck(int x, int y,Block block)
{
②return(③grid[x,y] != null && ④grid[x,y].parent != block.transform);
}
①メソッド名BlockCheck、xyとblockを引数で渡す
② 値を返しながら判定③④がどちらもtrueの時にtrue
③glid(2次元配列)が空でない時は他のブロックがある
④親が同じでない時は他のブロックがある
bool型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
演算子について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f
【foreach内に追記ー移移動先にブロックがあるか判断する関数の呼び出し】
//追記
①if (BlockCheck((int)pos.x, (int)pos.y, block))
{
②return false;
}
①移動先にブロックがあるのか確認(関数呼び出し)
②trueが返ってきた時(移動先にブロックがある時)に中に入る
falseを返す=移動先にはブロックがある為移動できません。
【ブロックが落ちたポジションを記録する関数】
①public void SaveBlockInGrid(Block block)
{
②foreach (Transform item in block.transform)
{
③Vector2 pos = Rounding.Round(item.position);
④grid[(int)pos.x, (int)pos.y] = item;
}
}
①他クラスから呼び出し可能な関数 SaveBlockInGrid名前 Block block引数
②親オブジェクトの分だけ(子も含む(block.transform))繰り返しループする
③作成した関数(Rounding.cs)の呼び出して(近くの位置の数値を丸める)、Vector2 pos変数に格納する
④itemをgrid(2次元配列)のxyポジションへ格納する
voidについて
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
foreachについて
https://qiita.com/hanatan079/items/9c29d7ab61729177cbe3
【ブロックが落ちたポジションを記録する関数の呼び出し】
(Board.cs)
//グリッドの生成
private void ①Awake()
{
②grid = new Transform[width,height];
}
(GameManeger.cs)
void Update()
{
if (Time.time > nextdropTimer)
{
nextdropTimer = Time.time + dropInterval;
if (activeBlock)
{
activeBlock.MoveDown();
if (!board.CheckPosition(activeBlock))
{
activeBlock.MoveUp();
//追記
③board.SaveBlockInGrid(activeBlock);
activeBlock = spawner.SpawnBlock();
}
}
}
}
①スタートより先に呼ばれる
②グリッドを生成する
③ブロックが落ちたポジションを記録する関数を呼び出す
引数にで格納されたブロックを渡す