Unityテトリスの作り方-6

※当サイトはアフィリエイト広告を使用しています。

テトリス作成

テトリスの作り方-6に入りました。

前回はminoが自動で生成されるスクリプトを追加しました。

しかし、現状は1つのminoが落ちても次のminoが落ちてこない状況です。

今回はminoがステージの下に着いたら、自動で次のminoが落ちてくる処理を追加します。

スポンサーリンク

Minoスクリプトに処理を追加

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Mino : MonoBehaviour
{
    public float previousTime;
    // minoの落ちる時間
    public float fallTime = 1f;

    // ステージの大きさ
    private int width = 10;
    private int height = 20;

    // mino回転
    public Vector3 rotationPoint;

    void Update()
    {
        MinoMovememt();
    }

    private void MinoMovememt()
    {
        // 左矢印キーで左に動く
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            transform.position += new Vector3(-1, 0, 0);
            
            if (!ValidMovement()) 
            {
                transform.position -= new Vector3(-1, 0, 0);
            }

        }
        // 右矢印キーで右に動く
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            transform.position += new Vector3(1, 0, 0);
            
            if (!ValidMovement()) 
            {
                transform.position -= new Vector3(1, 0, 0);
            }
        }
        // 自動で下に移動させつつ、下矢印キーでも移動する
        else if (Input.GetKeyDown(KeyCode.DownArrow) || Time.time - previousTime >= fallTime) 
        {
            transform.position += new Vector3(0, -1, 0);
            
            if (!ValidMovement()) 
            {
                transform.position -= new Vector3(0, -1, 0);
                // 今回追加
                this.enabled = false;
                FindObjectOfType<SpawnMino>().NewMino();
            }

            previousTime = Time.time;
        }
        else if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            // ブロックの回転
            transform.RotateAround(transform.TransformPoint(rotationPoint), new Vector3(0, 0, 1), 90);
        }
    }

    // minoの移動範囲の制御
    bool ValidMovement()
    {

        foreach (Transform children in transform)
        {
            int roundX = Mathf.RoundToInt(children.transform.position.x);
            int roundY = Mathf.RoundToInt(children.transform.position.y);

            // minoがステージよりはみ出さないように制御
            if (roundX < 0 || roundX >= width || roundY < 0 || roundY >= height)
            {
                return false;
            }
        }
        return true;
    }
}

今回追加した書いたスクリプトを解説します。
下の2行を追加しました。
this.enabled = false;
FindObjectOfType<SpawnMino>().NewMino();

minoが下に落ちる処理を書いているところに追加しています。

if (!ValidMovement()) 
{
      ①  transform.position -= new Vector3(0, -1, 0);
        // 今回追加
      ②  this.enabled = false;
      ③  FindObjectOfType<SpawnMino>().NewMino();
}

わかりやすく説明するように今回追加したところを抜粋しました。
①,②,③の順で解説します。

①もしValidMovement()に当てはまらなかったらminoのPositionを1つ下げる
②もしValidMovement()に当てはまらなかったらminoにfalseを返す
③もしValidMovement()に当てはまらなかったらSpawnMinoスクリプトからNewMinoメソッドを呼び出して新しいminoを生成する

という感じです。

Unity学習者おすすめの本

この本はUnity学習者におすすめです。
内容がとても良くてイラストで重要なポイントは解説されているので、理解しやすいです。

操作する内容は画像付きなので、同じ操作しても同じ動作にならないというようなことはないように工夫されています。

一冊勉強するだけで、大量の知識をインプットできるので、テトリス作成と同時進行で試してみてください。

今回のまとめ

今回、少し短かった気がしますがうまく実行できたでしょうか?

今回のスクリプト追加することで、minoの自動生成の処理がうまく実行できているかと思います。
しかし、このままではminoは上に積み上げることができません。

minoを積み上げるためにはGridを組む必要があります。
次回、minoを積み上げるための処理を解説します。

最後まで読んでいただきありがとうございました。

⭐️合わせて読もう
Unityテトリスの作り方-7

コメント

タイトルとURLをコピーしました