Использование двумерного массива для построения игровых объектов

Массивы удобная штука и часто используются, да и по сути, без них не обойтись в игрострое. Но кроме обычных, есть еще двумерные массивы. Итак, в данном примере, мы рассмотрим ситуацию, когда нам необходимо упорядочить множество одинаковых объектов. Наподобие кирпичной кладки. Создать с десяток клонов при помощи Ctrl + D, и расставить по позициям, не составляет труда. Но что делать, если нужна сотня клонов, а может и больше? При таком раскладе, проще напрячь скрипт, пусть он заморачивается. Более того, научимся задавать дополнительные параметры.

Не стоит тянуть кота за причинное место, приступим сразу к написанию скрипта, а уже по ходу дела, разберемся, что и как. Для начала добавим переменные.

Использование двумерного массива для построения игровых объектов

public GameObject block;
public float startPosX;
public float startPosY;
public int countX;
public int countY;
public float outX;
public float outY;
public string objName = "Block_";
private int id;
private GameObject[,] grid;

block - наш префаб, который будем клонировать.
startPosX - стартовая позиция по оси Х.
startPosY - стартовая позиция по оси Y.
countX - количество объектов по оси Х.
countY - количество объектов по оси Y.
outX - отступ по иксу.
outY - отступ по игрику.
objName - имя объекта.
id - используется для присвоения номера объекту.
grid - собственно сам массив.

Теперь надо определить отступ по Х и Y. Для этого добавим наш объект в сцену, установим позицию по нулям. Далее, делаем клона и перемещаем по иксу, укладываем их рядом, ровно, как и нужно. Тоже самое делаем и для оси Y. Не важно, отрицательное или положительное значение получилось, нам нужно только число. Стартовая позиция задается для первого объекта соответственно.



Чтение двумерного массива, делается следующим образом:


for(int y = 0; y < 3; y++)
{
	for(int x = 0; x < 3; x++)
	{
		array[x,y];
	}
}

Продолжим, финальная часть скрипта:

void Start () 
{
	id = 0;
	float posXreset = startPosX;
	grid = new GameObject[countX,countY];
	for(int y = 0; y < countY; y++)
	{
		startPosY -= outY;
		for(int x = 0; x < countX; x++)
		{
			id++;
			startPosX += outX;
			grid[x,y] = Instantiate(block, new Vector2(startPosX,startPosY), Quaternion.identity) as GameObject;
			grid[x,y].name = objName + id;
			grid[x,y].transform.parent = transform;
		}
		startPosX = posXreset;
	}
}

Что-же тут происходит? Переменная id у нас ровна нулю, соответственно, нумерация объектов будет начинаться с единицы. Затем, добавляем еще одну переменную, она нужна чтобы сохранить стартовые значения по иксу, если этого не сделать, то мы получим лесенку. Следует обратить внимание, что по оси Y у нас вычитание, а по Х - добавление. Проще говоря, наша конструкция будет строиться вправо по ширине и вниз по высоте.


Собственно, вот и вся магия. Осталось только запустить сцену и перетащить наш игровой объект, на котором висит скрипт, в папку Prefab например (не забыв потом удалить сам скрипт с получившегося префаба). Останавливаем сцену и сохраняем проект. Готово!

Комментариев 4

Офлайн
borshcreator 16 сентября 2016
Спасибо за урок. Можно немного дополнить скрипт что бы автоматически расставлять спрайты впритык друг к другу.

Объявляем приватную переменную SpriteRenderer
private SpriteRenderer spriteRender;

Кэшируем компонент и назначаем переменным отступа размер ширины и высоты спрайта:
spriteRender = block.GetComponent<SpriteRenderer>();
outX = spriteRender.bounds.size.x;
outY = spriteRender.bounds.size.y;
Офлайн
Raveoff 9 сентября 2017
Не могу расположить всё это дело по оси Z.
Подскажите что нибудь.
Офлайн
Light 10 сентября 2017
Raveoff, вместо new Vector2(startPosX,startPosY) -> new Vector3(startPosX,0,startPosY)
Офлайн
StefanVanhazen 25 марта 2018
public class Board : MonoBehaviour {
public class floor
{
public GameObject block;//сам пол
public float startPosX;//
public int countX;//
public float outX;//
public string objName = "floor1";//
private int id;//
private GameObject[,] grid;
}

// Use this for initialization
void Start() {

id = 0;
float posXreset = startPosX;
grid = new GameObject[countX];
for (int x = 0; x < countX; x++)
{
id++;
startPosX += outX;
grid[x] = Instantiate(block, new Vector2(startPosX, Quaternion.identity) as GameObject);
grid[x].name = objName + id;
grid[x].transform.parent = transform;
}
startPosX = posXreset;

}

// Update is called once per frame
void Update () {



}
}
Не понимаю где ошибка
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика