using System.Collections.Generic; using UnityEngine; /// /// менеджер тайлов /// инициализация, создание новых, удаление, отслеживание кол-ва тайлов /// public class TileManagerScript : MonoBehaviour { /// /// число тайлов, которые будут созданы /// [SerializeField] private int _NumTile; /// /// расстояние между центрами двух тайлов, нужно переделать, чтобы бралось само /// [SerializeField] private float _DistanceTiles; /// /// список префабов для случайной генерации /// [SerializeField] private List _TilePrefs = new List(); /// /// поле массива тайлов /// [SerializeField] private List _Tiles = new List(); /// /// при запуске сцены, создание новых тайлов /// private void Awake() { // координата самого дальнего тайла float z = -(_NumTile / 2) * _DistanceTiles; // создание тайлов назад от игрока, где i номер тайла, а z координата transfrom.position.z for (int i = 0; i < _NumTile; i++) { // генерация нового тайла, с собственным z GenerateTile(new Vector3(0, 0, z), new Quaternion(0, 0, 0, 0)); // увелечение позиции тайла по transform.position.z z += _DistanceTiles; } } /// /// генератор тайлов по заданному transform /// /// позиция нового тайла /// поворот нового тайла /// возвращает созданный тайл public GameObject GenerateTile(Vector3 pos, Quaternion rot) { // создание нового тайла GameObject newTile = Instantiate(GetRandomObject(_TilePrefs), pos, rot); // добавление массива в отслеживание _Tiles.Add(newTile); // подпись нового тайла на эвент SubTrigEvent(newTile); // перемещение нового тайла в менеджер как child newTile.transform.SetParent(gameObject.transform); //Debug.Log($"Was created new tile awake"); return newTile; } /// /// генерация тайла с добавлением его в конец списка /// /// возвращает созданный тайл public GameObject GenerateTile() { // индекс последнего элемента int index = _NumTile - 1; // позиция и поворот последнего тайла Vector3 pos = _Tiles[index].transform.position; Quaternion rot = _Tiles[index].transform.rotation; // создание нового position для генерации нового тайла Vector3 newVector = new Vector3(pos.x, pos.y, pos.z + _DistanceTiles); // создание нового тайла и получение его адреса GameObject newTile = Instantiate(GetRandomObject(_TilePrefs), newVector, rot); // добавление массива в отслеживание _Tiles.Add(newTile); // перемещение нового тайла в менеджер как child newTile.transform.SetParent(gameObject.transform); // подпись нового тайла на эвент тригера зоны SubTrigEvent(newTile); // удаление первого в списке тайла DeleteTile(); //Debug.Log($"Was created new tile"); return newTile; } /// /// Удалитель тайлов /// public void DeleteTile() { // индекс первого тайла в списке int index = 0; // удаление GameObject первого тайла Destroy(_Tiles[index]); // удаление первого тайла в списке _Tiles.RemoveAt(index); //Debug.Log("Was deleted tile"); } /// /// Подпись на триггер эвент в тайле /// /// передаваемый тайл на подпись private void SubTrigEvent(GameObject tile) { // прохождение по всем child в tile foreach (Transform child in tile.transform) { // если тайл является тригерной зоной, то подписаться и закончить if (child.CompareTag("Trigger Zone")) { // в подпись передаётся анонимная функция, так как GenerateTile() возвращает GameObject child.GetComponent().TriggerZoneEvent.AddListener(() => GenerateTile()); // выход из цикла break; } } } public void test() { GenerateTile(); } /// /// Генератор случайно взятого объекта /// /// /// Список из которого брать /// T GetRandomObject(List list) { // проверка на пустоту списка if (list == null || list.Count == 0) { return default; } // Генерация случайного индекса int randomIndex = UnityEngine.Random.Range(0, list.Count); return list[randomIndex]; } }