Проект Block в Unity3D
Проект Block в Unity3D
1) Создаем ресурсы для игры Bloks2) Создание заготовки 2D проекта на Unity3d 2) Создание заготовки 2D проекта на Unity3d3)Создание поля из блоков в Unity3d для игры Blocks 3)Создание поля из блоков в Unity3d для игры Blocks4) Создаем разноцветные блоки, и реакцию на нажатие мышкой на блок 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.csusing 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); } } |