Пятница, 26 Апреля 2024, 19:08

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Создание игры Block на Unity3d (Цикл уроков по созданию игры Block на Unity3d)
Создание игры Block на Unity3d
cibergodДата: Вторник, 08 Марта 2016, 18:06 | Сообщение # 1
был не раз
Сейчас нет на сайте
1) Создаем ресурсы для игры Bloks
2) Создание заготовки 2D проекта на Unity3d
3)Создание поля из блоков в Unity3d для игры Blocks
4) Создаем разноцветные блоки, и реакцию на нажатие мышкой на блок
5) Передача события нажатия на блок обратно в генератор карты для дальнейшей обработки сигнала
6) По щелчку мышки находим рядом стоящие блоки и обнуляем их цвет.
7) Добавляем физику блокам и завершаем проект.

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


LoadGame.cs
Код

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

                }
            }
        }

    }

}



Юнный недоигродел (( но очень стремлюсь
Даже сайт завел cibergod.ru
Но пока особо нечем хвастать
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Создание игры Block на Unity3d (Цикл уроков по созданию игры Block на Unity3d)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг