Если вы знакомы с двумя предыдущими материалами, то знаете, что каждый раз при запуске игры кристаллы создаются в определённых местах, в которых мы их разместили на этапе разработки. Это хорошо, но если в нашей игре бесконечное число уровней и мы хотим, чтобы с каждым новым уровнем положение кристаллов менялось, тогда нам нужно немного изменить логику игры, этим сегодня и займемся.
Для начала создадим новый пустой объект 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, которые мы создали ранее. Их нужно все выбрать и перетащить на это поле, чтобы его заполнить, должно получиться так как показано на рисунке:Все. Теперь можно несколько раз перезапустить игру и будет видно, что кристаллы размещаются случайным образом.