Проект Block в Unity3D

Проект Block в Unity3D



1) Создаем ресурсы для игры Bloks

2) Создание заготовки 2D проекта на Unity3d

2) Создание заготовки 2D проекта на Unity3d

3)Создание поля из блоков в Unity3d для игры Blocks

3)Создание поля из блоков в Unity3d для игры Blocks

4) Создаем разноцветные блоки, и реакцию на нажатие мышкой на блок

4) Создаем разноцветные блоки, и реакцию на нажатие мышкой на блок

5) Передача события нажатия на блок обратно в генератор карты для дальнейшей обработки сигнала 

5) Передача события нажатия на блок обратно в генератор карты для дальнейшей обработки сигнала

6) По щелчку мышки находим рядом стоящие блоки и обнуляем их цвет.

6) По щелчку мышки находим рядом стоящие блоки и обнуляем их цвет.

7) Добавляем физику блокам и завершаем проект.

7) Добавляем физику блокам и завершаем проект.

Ресурсы для проекта
 
 

 

 

 

Текстовое поле

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

public class LoadGame : MonoBehaviour {

    //эталонный блок для поля
    public GameObject Box;
    //размеры поля 
    static int col = 28, row = 16;

    //карта из блоков
    GameObject[,] map = new GameObject[col, row];

    //структура описание точки 
    struct Point
    {
        public int X, Y;
    }

    //список претендентов на уничтожение 
    List<Point> Pretindent = new List<Point>();
     //генератор координат которые нужно проверить
    List<Point> IndexList(Point coord)
    {
        //создаем список предпологаемых мест для поиска точки
        List<Point> P = new List<Point>();
        //обьявляем переменную которая будет расчетным буфером для точки 
        Point T;

        //проверяем существует ли вобще точка в том раене где хотим проверять
        if ((coord.X - 1) >= 0)
        {
            //расчитываем координату по Х
            T.X = coord.X - 1;
            //Расчитываем координату по Y
            T.Y = coord.Y;
            //Добавляем координату в массив
            P.Add(T);
        };

        if ((coord.X + 1) < col)
        {
            //расчитываем координату по Х
            T.X = coord.X + 1;
            //Расчитываем координату по Y
            T.Y = coord.Y;
            //Добавляем координату в массив
            P.Add(T);
        };

        if ((coord.Y - 1) >= 0)
        {
            //расчитываем координату по Х
            T.X = coord.X;
            //Расчитываем координату по Y
            T.Y = coord.Y - 1;
            //Добавляем координату в массив
            P.Add(T);
        };
        if ((coord.Y + 1) < row)
        {
            //расчитываем координату по Х
            T.X = coord.X;
            //Расчитываем координату по Y
            T.Y = coord.Y + 1;
            //Добавляем координату в массив
            P.Add(T);
        };
        //возвращаем найденный список точек 
        return P;
    }
    void CreateGamePole()
    {
        float Dx = 1.2f, Dy = 1.2f;
        Vector3 MyPoze = new Vector3(-7.6f, -4.35f, 0);

        for (int YY = 0; YY < row; YY++)
        {
            for (int XX = 0; XX < col; XX++)
            {

                map[XX, YY] = Instantiate(Box, MyPoze, Quaternion.identity) as GameObject; ;
                //получаем параметры блока
                MyPoze.x += Dx;
                BoxBehaviourScript CXCY = map[XX, YY].GetComponent<BoxBehaviourScript>();
                CXCY.CX = XX;
                CXCY.CY = YY;

                CXCY.MyMainGame = this.gameObject;

            }
            //обнуляем позицию Х
            MyPoze.x = -7.6f;
            //задаем новые координаты для У
            MyPoze.y += Dy;

        }
    }
    // Use this for initialization
    void Start () {
        CreateGamePole();
    }
    
    // Update is called once per frame
    void Update () {
        MoverDown();
    }

     //функция будет получать номер блока на который нажали 
    public void GetSelectIndex(int X, int Y) 
    {
        BoxBehaviourScript CXCY = map[X, Y].GetComponent<BoxBehaviourScript>();

     
        Pretindent.Clear();

        Point P;
        P.X =X; 
        P.Y =Y;

        TestBlock(P, CXCY.index);
        //проверяем сколько блоков найдено рядом 
        if (Pretindent.Count > 2) ClearBlockColor();
    }
    void TestBlock(Point coord, int IDColor)
    {
        //проверяем нет ли уже этой точки в списке на вылет 
        int Find = Pretindent.IndexOf(coord);
         //если не нашли значение значит равно -1
        if (Find == -1)
        {
            //получим цвет проверяемого блока 
            int IndexColor = map[coord.X, coord.Y].GetComponent<BoxBehaviourScript>().index;
            //если точка  
            if (IndexColor == IDColor)
            {
                //добавляем претиндента в список 
                Pretindent.Add(coord);
                //расчитываем координаты для поиска далее 
                List<Point> Test = IndexList(coord);
                //запускаем цикл поиска по точкам 
                foreach (Point T in Test) TestBlock(T, IDColor);
            }

        }
    }

    void ClearBlockColor()
    { 
        //Закрасим белым цветом все найденные точки 
        foreach (Point Clear in Pretindent)
        {
            //обнулим точки с правельным цветом 
            map[Clear.X, Clear.Y].GetComponent<BoxBehaviourScript>().index = 0;
        }
    }

    //функция сброса блоков вниз 
    void MoverDown()
    {
        for (int Y = 0; Y < row; Y++)
        {
            for (int X = 0; X < col; X++)
            {
                //проверяем пуст ли блок 
                if (map[X, Y].GetComponent<BoxBehaviourScript>().index == 0) 
                {
                    int Dy = Y + 1;
                    //проверяем может ли над нами быть кубик
                    if (Dy < row)
                    {
                        map[X, Y].GetComponent<BoxBehaviourScript>().index = map[X, Dy].GetComponent<BoxBehaviourScript>().index;
                        map[X, Dy].GetComponent<BoxBehaviourScript>().index = 0;
                    }
                    else 
                    {
                        map[X, Y].GetComponent<BoxBehaviourScript>().RandomColor();  
                    }
                }
            }
        }
    }
}

BoxBehaviourScript.cs

using UnityEngine;
using System.Collections;

public class BoxBehaviourScript : MonoBehaviour {

    //массив картинок 
    public Sprite[] Bloks;
    // цвет блока
    public int index = 0;
    //номер блока в сетке 
    public int CX, CY;

    //ссылка на игровой обьект который создал блок 
    public GameObject MyMainGame;

    // Use this for initialization
    void Start () {
        RandomColor();
        ChangeColor();
    }
    
    // Update is called once per frame
    void Update () {
        ChangeColor();
    }

    //функция случайной генерации цвета 
    public void RandomColor()
    {
        index = Random.Range(1, Bloks.Length);
    }
    void ChangeColor()
    {
        if (index < Bloks.Length)
        {
            //получаем свойство для изменения картинки
            SpriteRenderer R = this.GetComponent("SpriteRenderer") as SpriteRenderer;

            R.sprite = Bloks[index];
        }
    }
    void OnMouseDown()
    {
        LoadGame Map = MyMainGame.GetComponent<LoadGame>();

        Map.GetSelectIndex(CX, CY);
    }
}

230 0 850 1
0
RENDER.RU