유니티 테트리스 만들기!! 

 

1. 프로젝트 생성를 생성합니다.  템플릿은 2D를 선택하고 프로젝트 이름과 저장위치를 정하고 생성합니다. 

 

 

2.블록추가위해 Project의 Assets 창에서 Create -> Sprites -> Square 

 

3. Square를 Hierarchy 창으로 드래그하고 Ctrl+D를 3번 눌러서 총 4개 만든다....

Square,Square01,Square02,Square03를  모두 선택하고 Scale를 x, y를 0.9로 조정한다.

 

말로 설명하기 힘드니 영사을 보고 참조하고 만드세요. 

 

 

 

4. 좌측 화살표 버튼을 누르면 좌측으로 가게 하고, 우측 화살표 버튼을 누르면 우측으로 스크립트 코드를 입력한다.

C# 스크립트를 추가후 다음과 같이 입력한다.

TetrisBlock.cs 

 void Update()
    {
        if(Input.GetKeyDown(KeyCode.LeftArrow))
        {
            transform.position += new Vector3(-1, 0, 0);

        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            transform.position += new Vector3(1, 0, 0);

        }
    }

 

5. 테트리스 블록 아래로 내리기 , 테트리스 블록이 아래 떨어지는 기능이다. 

아래방향 화살표 버튼를 누르면 fallTime 속도로 아래로 떨어지고 아래방향 화살표 버튼을 누르지 않으면 fallTime/10 속도로 아래로 떨어진다.

 private float previousTime;
 public float fallTime = 1.0f;
 
 
    void Update()
    {


        if(Time.time - previousTime > (Input.GetKey(KeyCode.DownArrow) ? fallTime/10 : fallTime))
        {
            transform.position += new Vector3(0, -1, 0);
            previousTime = Time.time;
        }

    }

 

6. 테트리스 백그라운드 작업 width 10, height 20 으로 세팅한다. 

 

7. 테트리스 백그라운 작업 스크립트 

테트리스 백그라운 폭(width) = 10 , 높이(height) = 20 

테트리스 블록이 0 보다 작거나 폭(width), 높이(height)보다 크거나 같으면 백그라운드 밖으로 나간걸로 판단해서 false를 리턴한다. 

 public static int height = 20;
 public static int width = 10; 
 
 bool ValidMove()
 {
        foreach(Transform children in transform)
        {
            int roundX = Mathf.RoundToInt(children.transform.position.x);
            int roundY = Mathf.RoundToInt(children.transform.position.y);

            if(roundX < 0 || roundX >=width || roundY < 0 || roundY >= height)
            {
                return false;
            }
        }

        return true;

 }

 

8. 테트리스 블록을 벽과의 충돌 인식하기 

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

public class TetrisBlock : MonoBehaviour
{
    private float previousTime;
    public float fallTime = 1.0f;
    public static int height = 20;
    public static int width = 10;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            transform.position += new Vector3(-1, 0, 0);
            if(!ValidMove())
            {
                transform.position -= new Vector3(-1, 0, 0);
            }

        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            transform.position += new Vector3(1, 0, 0);
            if (!ValidMove())
            {
                transform.position -= new Vector3(1, 0, 0);
            }
        }

        if(Time.time - previousTime > (Input.GetKey(KeyCode.DownArrow) ? fallTime/10 : fallTime))
        {
            transform.position += new Vector3(0, -1, 0);
            if (!ValidMove())
            {
                transform.position -= new Vector3(0, -1, 0);
            }
            previousTime = Time.time;
        }

    }

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

            if(roundX < 0 || roundX >=width || roundY < 0 || roundY >= height)
            {
                return false;
            }
        }

        return true;

    }
}

 

9 테트리스 블록 회전하게 만들기

public Vector3 rotationPoint;

else if (Input.GetKeyDown(KeyCode.UpArrow))
{
            //회전하기
            transform.RotateAround(transform.TransformPoint(rotationPoint), new Vector3(0, 0, 1), 90);
            if(!ValidMove())
            {
                transform.RotateAround(transform.TransformPoint(rotationPoint), new Vector3(0, 0, 1), -90);
            }
}

 

10. 테트리스 블록을 여러개 만들고 그 블록을 프리팹으로 만든다. 그리고 기존것들을 삭제한다. 

그리고 Hierarchy창에서 GameObject를 하나 만들고 이름을 SPAWNER로 정한다. 

그리고 position x 5 y 17로 정한다. 

그리고 C# 스크립트를 하나 더 생성한고 파일명은 spawnertetris로 정하고 SPAWNER에 드래그한다. 

 

11. 테트리스 블록을 랜던으로 나오게 하기 spawnertetris.cs

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

public class spawnertetris : MonoBehaviour
{
    public GameObject[] Tetris;

    // Start is called before the first frame update
    void Start()
    {
        NewTetris();
    }

    public void NewTetris()
    {
        Instantiate(Tetris[Random.Range(0, Tetris.Length)], transform.position, Quaternion.identity);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

12. 테트리스 블록이 바닥에 닿으면 또 새로운 블록이 나오게 하기 TetrisBlock.cs 

  if(Time.time - previousTime > (Input.GetKey(KeyCode.DownArrow) ? fallTime/10 : fallTime))
        {
            transform.position += new Vector3(0, -1, 0);
            if (!ValidMove())
            {
                transform.position -= new Vector3(0, -1, 0);
                this.enabled = false;
                FindObjectOfType<spawnertetris>().NewTetris();
            }
            previousTime = Time.time;
        }

 

13. 테트리스 블록 겹치지 않게 하기 

private static Transform[,] grid = new Transform[width, height];

  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;
        }
    }
 void Update()
    {
       ...

        if(Time.time - previousTime > (Input.GetKey(KeyCode.DownArrow) ? fallTime/10 : fallTime))
        {
            transform.position += new Vector3(0, -1, 0);
            if (!ValidMove())
            {
                transform.position -= new Vector3(0, -1, 0);
                AddToGrid();
                this.enabled = false;
                FindObjectOfType<spawnertetris>().NewTetris();
            }
            previousTime = Time.time;
        }

        

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

            if(roundX < 0 || roundX >=width || roundY < 0 || roundY >= height)
            {
                return false;
            }

            if (grid[roundX, roundY] != null)
                return false;
        }

        return true;
    }

 

 

14. 테트리스 블록이 꽉찬 줄은 삭제하고 아래로 내리기 

 void CheckForLines()
    {
        for(int i=height-1; i>=0; i--) // 테트리스 블록을 맨 윗줄부터 아래까지 검색한다.
        {
            if(HasLine(i))  // 줄이 블록으로 꽉차 있을경우
            {
                DeleteLine(i);  // 그 줄을 삭제하고
                RowDown(i);  // 줄을 한칸 내린다. 
            }
        }
    }
 bool HasLine(int i)  // 줄이 블록으로 꽉 차 있는지 확인하기
    {
        for(int j =0;j<width;j++)  //줄을 0~9까직 검색한다.
        {
            if (grid[j, i] == null)  // 비어 있다면 
                return false;        //  false를 리턴한다. 
        }
        return true;  //줄이 꽉 차 있다면 true를 리턴한다. 
    }
 void DeleteLine(int i)  // 줄을 삭제한다. 
    {
        for(int j=0; j < width ; j++)
        {
            Destroy(grid[j, i].gameObject);  
            grid[j, i] = null;
        }
    }
void RowDown(int i)  // 줄을 아래로 내린다.
    {
        for(int y = i; y < height; y++)
        {
            for(int j=0;j<width;j++)
            {
                if(grid[j,y] != null) // 윗줄을 아랫줄로 복사하는 과정이다.
                {
                    grid[j, y - 1] = grid[j, y];
                    grid[j, y] = null;
                    grid[j, y - 1].transform.position -= new Vector3(0, 1, 0);
                }
            }
        }
    }

초등학생도 따라 만들 수 있는 유니티로 테트리스 만들기 영상보기

https://youtu.be/kBEKOkyCYkM

 

+ Recent posts