Dizel 6f4c1454cb Скрипт генерации карты и зоны тригера
Закончен скрипт генерации карты по готовым префабам, закончен скрипт тригерной зоны
2024-12-11 20:57:06 +03:00

176 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// менеджер тайлов
/// инициализация, создание новых, удаление, отслеживание кол-ва тайлов
/// </ summary >
public class TileManagerScript : MonoBehaviour
{
/// <summary>
/// число тайлов, которые будут созданы
/// </summary>
[SerializeField]
private int _NumTile;
/// <summary>
/// расстояние между центрами двух тайлов, нужно переделать, чтобы бралось само
/// </summary>
[SerializeField]
private float _DistanceTiles;
/// <summary>
/// список префабов для случайной генерации
/// </summary>
[SerializeField]
private List<GameObject> _TilePrefs = new List<GameObject>();
/// <summary>
/// поле массива тайлов
/// </summary>
[SerializeField]
private List<GameObject> _Tiles = new List<GameObject>();
/// <summary>
/// при запуске сцены, создание новых тайлов
/// </summary>
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;
}
}
/// <summary>
/// генератор тайлов по заданному transform
/// </summary>
/// <param name="pos">позиция нового тайла</param>
/// <param name="rot">поворот нового тайла</param>
/// <returns>возвращает созданный тайл</returns>
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;
}
/// <summary>
/// генерация тайла с добавлением его в конец списка
/// </summary>
/// <returns>возвращает созданный тайл</returns>
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;
}
/// <summary>
/// Удалитель тайлов
/// </summary>
public void DeleteTile()
{
// индекс первого тайла в списке
int index = 0;
// удаление GameObject первого тайла
Destroy(_Tiles[index]);
// удаление первого тайла в списке
_Tiles.RemoveAt(index);
//Debug.Log("Was deleted tile");
}
/// <summary>
/// Подпись на триггер эвент в тайле
/// </summary>
/// <param name="tile">передаваемый тайл на подпись</param>
private void SubTrigEvent(GameObject tile)
{
// прохождение по всем child в tile
foreach (Transform child in tile.transform)
{
// если тайл является тригерной зоной, то подписаться и закончить
if (child.CompareTag("Trigger Zone"))
{
// в подпись передаётся анонимная функция, так как GenerateTile() возвращает GameObject
child.GetComponent<TriggerZoneScript>().TriggerZoneEvent.AddListener(() => GenerateTile());
// выход из цикла
break;
}
}
}
public void test()
{
GenerateTile();
}
/// <summary>
/// Генератор случайно взятого объекта
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">Список из которого брать</param>
/// <returns></returns>
T GetRandomObject<T>(List<T> list)
{
// проверка на пустоту списка
if (list == null || list.Count == 0)
{
return default;
}
// Генерация случайного индекса
int randomIndex = UnityEngine.Random.Range(0, list.Count);
return list[randomIndex];
}
}