0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-11-14

こちらを元に解説しています。
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が−1、1)、上下(yが1、ー1)

【(関数)回転用-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);

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0