Простая 2D-игра на Unity 5. Часть 3

Если вы знакомы с двумя предыдущими материалами, то знаете, что каждый раз при запуске игры кристаллы создаются в определённых местах, в которых мы их разместили на этапе разработки. Это хорошо, но если в нашей игре бесконечное число уровней и мы хотим, чтобы с каждым новым уровнем положение кристаллов менялось, тогда нам нужно немного изменить логику игры, этим сегодня и займемся. 

Для начала создадим новый пустой объект Game Controller, который будет контролировать случайное размещение кристаллов на игровом поле. К нему мы привяжем скрипт с этим же названием.Но с созданием скрипта пока отложим, а сейчас нужно сделать одно серьезное дело. Создадим еще один пустой объект Nodes. Этот объект будет родителем для большого количества дочерних объектов Node, которые будут размещаться в каждой ячейке на игровом поле. Для чего нам это нужно? А нужно нам это для того, чтобы определять координаты каждой ячейки, по расположению на ней объекта Node, и, зная эти координаты, помещать или не помещать в них (случайным образом) кристаллы. Итак, создадим объекты Node, по одному на ячейку и разместим их, каждый на своем месте. Но одну ячейку мы пропускаем, я думаю, уже понятно какую… ячейку занимаемую тарелкой. Во вкладке Hierarchy мы получаем следующую структуру:Теперь, когда все нужные объекты созданы, приступим к созданию программной части. В папке Scripts вкладки Project создадим новый скрипт и назовем его GameController.Его содержимое будет следующим:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class GameController : MonoBehaviour {
	public GameObject pickup;
	public int pickupCount;
	public List nodeList = new List();
	private GameObject node = null;
	// Use this for initialization
	void Start () {
		SpawnPickups ();
	}
	void SpawnPickups() {
		for (int i = 1; i <= pickupCount; i++) {
			node = nodeList[ Random.Range(0,nodeList.Count) ];
			Vector3 spawnPosition = node.transform.position;
			Quaternion spawnRotation = Quaternion.identity;
			Instantiate (pickup, spawnPosition, spawnRotation);
		}
	}
	// Update is called once per frame
	/*void Update () {
	}*/
}

После чего добавим созданный скрипт как компонент для объекта Game Controller. У компонента нужно заполнить 3 поля. Первый – Pickup, в него мы добавляем кристалл Pickup из папки Prefabs. Второй – Pickup Count, это количество кристаллов, которые нужно разместить, для окончания игры, нам их нужно 12. Третий – Node List, это массив пустых объектов Node, которые мы создали ранее. Их нужно все выбрать и перетащить на это поле, чтобы его заполнить, должно получиться так как показано на рисунке:Все. Теперь можно несколько раз перезапустить игру и будет видно, что кристаллы размещаются случайным образом.