Скрипт генерации карты и зоны тригера

Закончен скрипт генерации карты по готовым префабам, закончен скрипт тригерной зоны
This commit is contained in:
Dizel
2024-12-11 20:57:06 +03:00
parent 3d15c0dc4c
commit 6f4c1454cb
16 changed files with 201 additions and 511 deletions

View File

@ -1,12 +1,10 @@
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
/// <summary>
/// менеджер тайлов
/// инициализация, создание новых, удаление, отслеживание кол-ва тайлов
/// </summary>
/// </ summary >
public class TileManagerScript : MonoBehaviour
{
/// <summary>
@ -16,89 +14,162 @@ public class TileManagerScript : MonoBehaviour
private int _NumTile;
/// <summary>
/// номер текущего тайла
/// расстояние между центрами двух тайлов, нужно переделать, чтобы бралось само
/// </summary>
public int CurrentTile;
//
[SerializeField]
private float _DistanceTiles;
/// <summary>
/// список префабов для случайной генерации
/// </summary>
[SerializeField]
private List<GameObject> _TilesPref = new List<GameObject>();
private List<GameObject> _TilePrefs = new List<GameObject>();
/// <summary>
/// поле массива тайлов
/// </summary>
private List<GameObject> _Tiles;
[SerializeField]
private List<GameObject> _Tiles = new List<GameObject>();
// при запуске сцены, создание новых тайлов
/// <summary>
/// при запуске сцены, создание новых тайлов
/// </summary>
private void Awake()
{
Debug.Log($"NumTile = {_NumTile}");
// создание массива
_Tiles = new List<GameObject>(_NumTile);
Debug.Log($"_Tiles = {_Tiles.Count}");
// запихивание в массив тайлов null, чтобы понимать, что там пусто
for (int i = 0; i < _Tiles.Count; i++)
{
_Tiles[i] = null;
}
Debug.Log($"_Tiles = {_Tiles.Count}");
float z = (_NumTile/2) * _DistanceTiles;
Debug.Log($"z = {z}");
// координата самого дальнего тайла
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));
z -= _DistanceTiles;
// увелечение позиции тайла по 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>
/// <param name="tile"></param>
/// <param name="pos"></param>
/// <param name="rot"></param>
public void GenerateTile(Vector3 pos, Quaternion rot)
/// <returns>возвращает созданный тайл</returns>
public GameObject GenerateTile()
{
Instantiate(_TilesPref[0], pos, rot);
}
/// <summary>
/// Генератор тайлов за последним
/// </summary>
public void GenerateTile()
{
Vector3 pos = _Tiles.Last().transform.position;
Quaternion rot = _Tiles.Last().transform.rotation;
// индекс последнего элемента
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);
Instantiate(_TilesPref[0], new Vector3(), rot);
// создание нового тайла и получение его адреса
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>
/// <param name="tile"></param>
public void DeleteTile()
{
Destroy(_Tiles[0]);
_Tiles.RemoveAt(0);
//GenerateTile();
// индекс первого тайла в списке
int index = 0;
// удаление GameObject первого тайла
Destroy(_Tiles[index]);
// удаление первого тайла в списке
_Tiles.RemoveAt(index);
//Debug.Log("Was deleted tile");
}
void Start()
/// <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;
}
}
}
// Update is called once per frame
void Update()
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];
}
}