【テトリス作成③】ブロックの自動落下機能について深掘る

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

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


```
(見本)Block.cs
   //回転していいブロックかどうか 
    [SerializeField]
    private bool canRotate = true;



    //移動用
    void Move(Vector3 moveDirection)
    {
        transform.position += moveDirection;
    }

    //移動関数を呼ぶ関数(4種類)
    public void MoveLeft()
    {
        Move(new Vector3(-1,0,0));
    }

        public void MoveRight()
    {
        Move(new Vector3(1,0,0));
    }

        public void MoveUp()
    {
        Move(new Vector3(0,1,0));
    }

        public void MoveDown()
    {
        Move(new Vector3(0,-1,0));
    }

    //回転用(2種類)
    public void RotateRight()
    {
        if(canRotate)
        {
            transform.Rotate(0,0,-90);
        }
    }

        public void RotateLeft()
    {
        if(canRotate)
        {
            transform.Rotate(0,0,90);
        }
    }

(GameManager.cs)
    void Update()
    {
        //下に落ちるように関数呼び出し
        if (activeBlock)
        {
            activeBlock.MoveDown();
        }

    }

```
解説
【(変数)回転していいブロックかどうか】 
``` 
   ①[SerializeField]
   ②private bool canRotate = ③true;
```
①インスペクタ呼び出し
②bool型(変数)→真偽値を入れる
③今回はtrueを入れる、trueだったら回転可能


【（関数）移動用】 
```

    ①void ②Move(Vector3 moveDirection)
    {
        ③transform.position ④+= ⑤moveDirection;
    }
```
①何もないことを意味するデータ型
②Moveメゾット、動かしたい方向へ引数を渡す
　　Vector3位置指定、moveDirection引数(数値)
③~~現在の位置,加算して代入,引数(数値)受け取り~~
 　現在地へmoveDirection引数をプラスする

現在の位置からmoveDirectionへ動くようにする

Moveメゾット について
https://learn.microsoft.com/ja-jp/dotnet/api/system.io.file.move?view=net-7.0
https://qiita.com/hanatan079/items/a109b40b0e159779590c
代入演算子
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f


【（関数）移動関数を呼ぶ関数-4種類】
```
    ①public void MoveLeft()
    {
        ②Move(new ③Vector3(-1,0,0));
    }

        ①public void MoveRight()
    {
        ②Move(new ③Vector3(1,0,0));
    }

        ①public void MoveUp()
    {
        ②Move(new ③Vector3(0,1,0));
    }

        ①public void MoveDown()
    {
       ②Move(new ③Vector3(0,-1,0));
    }
```
①他から呼び出し可能
　　　左右上下移動
②Move=オブジェクトを移動する
       動きたい方向へ引数を渡す
③左右(xが−１、１)、上下(yが１、ー１)


【（関数）回転用-2種類】 
```
    ①public void RotateRight()
    {
       ②if(canRotate)
        {
            ③transform.Rotate(0,0,-90);
        }
    }
       ①public void RotateLeft()
    {
        ②if(canRotate)
        {
            ③transform.Rotate(0,0,90);
        }
    }
```
①他から呼び出し可能
②canRotate→(変数)回転していいブロックかどうか
　　　もし回転できるブロックなら回転する
③z軸を中心に回転する


【下に落ちるように関数呼び出す】
```
(GameManager.cs)
    void Update()
    {
        ①if (activeBlock)
        {
           ② activeBlock.MoveDown();
        }

    }
```
①ブロック内にブロックがあるなら
②そのブロックを下へ落下させる


【落下速度制限の実装】
```
(見本)GameManeger.cs

    //次のブロックが落ちるまでのインターバル時間
        [SerializeField]
        private float dropInterval = 0.25f;
    //次にブロックが落ちるまでの時間
        float nextdropTimer;

    void Update()
    {
        //Updateで時間判定をして判定次第で落下関数を呼ぶ
        if (Time.time > nextdropTimer)
        {
            nextdropTimer = Time.time + dropInterval;
            if (activeBlock)
            {
                activeBlock.MoveDown();
            }
        }
    }


```

解説
```
//次のブロックが落ちるまでのインターバル時間
    [SerializeField]
    ①private float dropInterval = 0.25f;
//次にブロックが落ちるまでの時間
    ②float nextdropTimer;

```
①インターバル時間を0.25とする
②nextdropTimer（変数）

float型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88

【Updateで時間判定をして判定次第で落下関数を呼ぶ】
```
    void Update()
    {
       
       ①if (Time.time > nextdropTimer)
        {
            ②nextdropTimer = Time.time + dropInterval;
          
            ③if (activeBlock)
            {
                ④activeBlock.MoveDown();
            }
        }
    }

```
①Time.time=ゲーム開始時から現在までの経過時間（秒）
  もしタイマー時間よりプレイ時間の方が長くなっていたら
②nextdropTimer(次にブロックが落ちるまでの時間)
  dropInterval(次のブロックが落ちるまでのインターバル時間)
　　　現在のゲーム時間＋インターバルの時間をnextdropTimerに代入
　　　　その為、一時的に落下を防止する。
③もしactiveBlock(配列内に生成されたブロック)がある時は
④activeBlockは下に移動する


【ブロックの位置を調整(スタート)】
```
(GameManeger.cs)

spawner.transform.position= Rounding.Round(spawner.transform.position);

```