Для понимания, игра три в линию.
Есть два скрипта.
Первый отвечает за заполнение игрового поля префабами (рабочие скрипты, без длинных "если"). Создаются объекты smilebox в двумерном массиве.
public class StartGame : MonoBehaviour
{
public GameObject box;
private float BoxX = 11;
private float BoxY = 0.27f;
public int countX;
public int countY;
private GameObject[,] field;
public GameObject[] smile;
public GameObject[,] smilebox;
int rnd;
int[,] rand;
int tr1;
int tr2;
int tr3;
int x1;
int y1;
void Start()
{
int n = 0;
rand = new int[countX+1, countY+1];
field = new GameObject[countX+1, countY+1];
smilebox = new GameObject[countX+1, countY+1];
while (n == 0) //дополнительные проверки для создания поля смайлов, соответствующе необходимым критериям
{
n = 1;
for (int x = 0; x <= countX; x++)
{
for (int y = 0; y <= countY; y++)
{
rnd = Random.Range(0, 6);
if (y > 1 && rand[x, y - 2] == rand[x, y - 1])
{
tr1 = rand[x, y - 1]; }
if (x > 1 && rand[x - 2, y] == rand[x - 1, y])
{
tr2 = rand[x - 1, y]; }
if (x > 0 && y > 0 && rand[x - 1, y] == rand[x - 1, y - 1] && rand[x - 1, y] == rand[x, y - 1])
{
tr3 = rand[x - 1, y];
while (rnd == tr1 || rnd == tr2 || rnd == tr3)
{
rnd = Random.Range(0, 6);}
rand[x, y] = rnd;
tr1 = 100;
tr2 = 100;
tr3 = 100;}} }
for (int x = 0; x <= countX; x++)
{
for (int y = 0; y <= countY; y++)
{
rnd = rand[x, y]; // выбор спрайта
field[x, y] = Instantiate(box, new Vector2(BoxX + x, BoxY - y), Quaternion.identity); // создание игрового поля
smilebox[x, y] = Instantiate(smile[rnd], new Vector2(BoxX + x, BoxY - y), Quaternion.identity); //создание смайла объекта
} } } }
Второй скрипт под названием smilecontroller находится на каждом создаваемом в первом скрипте объекте и отвечает за перемещение активного smilebox.
public class SmileController : MonoBehaviour
{
public StartGame startgame;
bool MouseDown = false;
Vector2 StartPosicion;
Vector2 FinishPosicion;
Vector2 TriggerPosicion;
Vector2 VectorTrigger;
int x3;
int y3;
private void Start()
{
StartPosicion = GetComponent<Transform>().position; // присвоение начальной позиции
}
void OnMouseDown()
{
{ MouseDown = true;
GetComponent<BoxCollider2D>().isTrigger = true; //активация тригера у выбранного объекта
}
}
void OnMouseUp()
{
MouseDown = false;
GetComponent<BoxCollider2D>().isTrigger = false;
}
void OnTriggerEnter2D(Collider2D other)
{
TriggerPosicion = other.GetComponent<Transform>().position; // стартовая позиция объекта-взаимодействия
VectorTrigger = TriggerPosicion - StartPosicion; // вектор перемещения при взаимодействии
float x2 = Mathf.Abs(VectorTrigger.x);
float y2 = Mathf.Abs(VectorTrigger.y);
if (VectorTrigger.x > 0) // разные условия направления перемещения по вектору
{
x3 = 1;
}
else
{
x3 = -1;
}
if (VectorTrigger.y > 0)
{
y3 = 1;
}
else
{
y3 = -1;
}
if (x2>y2)
{
FinishPosicion = new Vector2(x3, 0);
}
else
{
FinishPosicion = new Vector2(0, y3);
}
MouseDown = false;
GetComponent<BoxCollider2D>().isTrigger = false;
StartPosicion = StartPosicion + FinishPosicion; // окончательная позиция
}
private void Update()
{
Vector2 Cursor = Input.mousePosition;
Cursor = Camera.main.ScreenToWorldPoint(Cursor);
float x1 = Mathf.Abs(Cursor.x - StartPosicion.x);
float y1 = Mathf.Abs(Cursor.y - StartPosicion.y);
if (MouseDown) // перемещение только по вертикали, либо горизонтали
{
if (x1 > y1)
{
this.transform.position = new Vector2(Cursor.x, StartPosicion.y); }
else
{
this.transform.position = new Vector2(StartPosicion.x, Cursor.y);}}
else
{
this.transform.position = StartPosicion; }}}
Необходимо определить x и у активного smilebox[x,y] для дальнейшей проверки условий между соседними смайлами и удалением их при выполнении условий.