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