Unityテトリスの作り方-4

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

テトリス作成

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

前回は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);
            }

            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;
    }
}

今回追加したコードを解説します。
private int width = 10; はステージの横幅の変数を定義しています。
private int height = 20; はステージの縦幅の変数を定義してます。

BoolのValidMovementメソットでminoがステージ上から出ないように処理を書いています。
Mathf.RoundToIntで四捨五入したminoの位置の値が取得できるようにしていて、
minoの位置がステージ外であればfalseを返して、ステージ内であればTrueを返すという処理を設定しています。

ざっくり説明するとminoがステージ外に出ないように処理が書かれていると思ってください。

Unityを勉強する

Udemyで学習する

個人的に、最初のUnityでの開発は動画を見ながら行うことをオススメします。

Udemyには初心者向けから中級者向けなどUnityを教えてくれる教材が揃っていて、割引期間だと数千円で講座を受講できます。
スペシャリストの方の講義が数千円で学べると思うと本当に安いと感心します。

実際に私もいくつかUdemyで課金をして色々学んでいます。

また、Udemyを使ったことがない方も30日返金保証もついているので安心して始めることができます。
まずはお試しで講座を受講してみましょう。

本で勉強する

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

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

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

今回のまとめ

今回はテトリスがステージ内だけで、移動できてステージ外には出ることができないように処理を設定しました。

しかし、動画で見てわかるようにTminoが下についても、新しく他のminoが生成されません。
次回は、minoをランダムで生成するところから始めます!

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

⭐️あわせて読もう!
Unityテトリスの作り方-5

コメント

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