Unityテトリスの作り方-7

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

テトリス作成

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

前回は、自動でminoがステージの下の着くと新しいminoが自動生成されるところまでを作成しました。

今回はGridを組んでminoを積み上げる処理を追加します。
徐々にプログラムも複雑になっていきますが、わかりやすく解説していますので頑張りましょう!

スポンサーリンク

Gridとは?

先にGridについて説明します。
Gridとは網目上に組んだ線のことを指します。
2DのTransformも同じ仕組みでできていて、次の画像1を確認してください。

画像1

Gridを組む処理を書こう!

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

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

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

    // mino回転
    public Vector3 rotationPoint;

    // 今回の追加
    private static Transform[,] grid = new Transform[width, height];

    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);
                // 今回の追加
                AddToGrid();
                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);
        }
    }

    // 今回の追加
    void AddToGrid() 
    {
        foreach (Transform children in transform) 
        {
            int roundX = Mathf.RoundToInt(children.transform.position.x);
            int roundY = Mathf.RoundToInt(children.transform.position.y);

            grid[roundX, roundY] = children;
        }
    }

    
    // 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;
            }
            // 今回の追加
            if (grid[roundX, roundY] != null)
            {
                return false;
            }

        }
        return true;
    }
}

コピペでも動くようにすべてのプログラムを載せています。
今回追加したところだけ抜粋して解説します。

grid を変数として定義

// 今回の追加
private static Transform[,] grid = new Transform[width, height];

gridは上でも解説したので、割愛します。
new = Transform[width, height]; はwidthはx軸、heightはy軸を指しています。

AddToGridメソットを追加

// 今回の追加
    void AddToGrid() 
    {
        
        foreach (Transform children in transform) 
        {
            int roundX = Mathf.RoundToInt(children.transform.position.x);
            int roundY = Mathf.RoundToInt(children.transform.position.y);

            grid[roundX, roundY] = children;
        }
        
    }

    
    // 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;
            }
            // 今回の追加
            if (grid[roundX, roundY] != null)
            {
                return false;
            }
        }
        return true;
    }

AddToGridメソッドを追加して、
minoが上に積み上がるように設定します。
しかし、これだけでは上には積み上がりません。

ValidMovementでステージ外へは出ないように設定したように、
gridの中には他のgridが入らないように
if (grid[roundX, roundY] != null) { return false; }
の処理を追加しました。

AddToGridメソッドをMovementメソットへ追加

// 自動で下に移動させつつ、下矢印キーでも移動する
        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);
                // 今回の追加
                AddToGrid();
                this.enabled = false;
                FindObjectOfType<SpawnMino>().NewMino();
            }

            previousTime = Time.time;
        }

AddToGridメソッドをMovementメソッドのminoが下に移動する時に読み込んでもらうように追加します。

Unity学習者おすすめの本

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

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

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

今回のまとめ

今回はテトリスを上に積み上げる処理を追加しました。
しかし、このままでは1列がそろってもminoが消えません。

次回は、minoがそろったら1列そろったらminoも消えるという処理を追加します。

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

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

コメント

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