【テトリス作成②】ブロックスポーン生成について深掘る

こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119

★★★★★随時更新★★★★★
2022.11.22追記
20022.11.28追記
★★★★★★★★★★★★★★★

```
(見本)Spawner.cs

    //生成するブロックすべて格納(配列)
       [SerializeField]
       Block[] Blocks;

    //ランダムなブロックを1つ選ぶ
    Block GetRandomBlock()
    {
        int i = Random.Range(0, Blocks.Length);
        if(Blocks[i])
        {
            return Blocks[i];
        }
        else
        {
            return null;
        }
    }

    //選ばれたブロックを生成
    public Block SpawnBlock()
    {
        Block block = Instantiate(GetRandomBlock(), transform.position, Quaternion.identity);
        if(block)
        {
            return block;
        }
        else
        {
            return null;
        }
    }
```
```
(見本)GameManeger.cs

//スポナー
Spawner spawner;
//生成されたブロック格納
Block activeBlock;

//スポナーオブジェクトをスポナー変数に格納するコード
    private void Start()
    {
       ② spawner =③GameObject.④FindObjectOfType⑤<Spawner>();

//スポナークラスからブロック生成関数をよんで変数に格納する
        ①if (!activeBlock)
        {
            ②activeBlock = spawner.SpawnBlock();
        }
    }
```

解説
```
(配列）
    //生成するブロックすべて格納
       ①[SerializeField]
      ②Block[] ③Blocks;
```
①インスペクタから設定できるように
②ブロック型の配列(作成した7つのブロックを全て格納する用)
③~~Block[](7つのブロックが入った配列)をBlocksという名前にする~~
   変数名Blocks
変数について
https://qiita.com/hanatan079/items/8d93186d25d460bd378e

Hierarchie　>　spawner　のインスペクタにBlock[]が表示され、そこへプレファブのブロック(7こ)を格納する。

```
(関数)
    //配列に格納されたブロックからランダムに1つ選ぶ
    ①Block ②GetRandomBlock()
    {
     int i = ③Random.Range(0,④Blocks.Length);
       ⑤ if(Blocks[i])
        {
           ⑥ return Blocks[i];
        }
        ⑦ else
        {
          ⑧ return null;
        }
    }
```
①Block関数、Block型の値を呼ばれた場所に返す
②GetRandomBlock名前
③~~引数を2つ設定することで2つの中からランダムに選ぶ~~
   最小値０〜最大値Blocks.Length(④)の中からランダムに選ぶ
④配列に格納した要素数　　　
　(配列には7つのブロックが格納されている＝0~7未満が返ってくる)
⑤配列の中にはi(0~7未満)の配列(ブロック)はあるのか
⑥あるのであればi番目のブロックを返す
⑦ブロックが無いのであれば
⑧null=空を返す

型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
if文について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

```
(関数)
    //選ばれたブロックを生成し変数を格納する
    ①public ②Block SpawnBlock()
    {
       ③ Block block = ④Instantiate(GetRandomBlock(), transform.position,　Quaternion.identity);
        ⑤if(block)
        {
           return block;
        }
        else
        {
           return null;
        }
    }

```
①他から呼び出し
②~~ブロック型、選ばれたブロックの名前をSpawnBlockとする~~
  ブロック関数、変数SpawnBlock
③Block関数、変数blockへ
④GetRandomBlockプレファブを生成して③へ格納する
⑤　~~block変数があるのか~~
　　　~~あるのであればブロックを返し無いのであれば空を返す~~
  ランダムにブロックが選ばれたらそのブロックを渡し、無いのであれば空を渡す

Instantiate関数について
https://qiita.com/hanatan079/items/66a183ea5168c985c366
if文について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

```
(GameManeger.cs)
(配列)
//スポナー
①Spawner spawner;

//生成されたブロック格納
②Block activeBlock;
```
①スポナー型、変数
②ブロック型、変数

変数について
https://qiita.com/hanatan079/items/8d93186d25d460bd378e

```
//Spawnerオブジェクトをspawner変数に格納するコード
    private void Start()
    {
       ①spawner　=GameObject.FindObjectOfType<Spawner>();

//スポナークラスからブロック生成関数をよんで変数に格納する
        ②if (!activeBlock)
        {
            ③activeBlock = spawner.SpawnBlock();
        }
    }
```
①全てのオブジェクトからSpawnerコンポーネントを探してspawner変数へ格納する
FindObjectOfTypeは全てのコンポーネントの中から<>を探すため重い処理。乱用注意。

②本来は生成されたブロックが格納されていればtrue
　　　（！）生成されたブロックが格納されていなければ(空だったら)true
③生成されていなかったら、Spawner spawne（スポナー）をactiveBlock（生成されたブロック）へ格納する

if文、！否定について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f
FindObjectOfTypeについて
https://qiita.com/hanatan079/items/9b0c62cb3beeb9b4fdd1