PJ/Assets/scripts/dotfs_scripts/MANAGER_TowerGeneraton.cs

78 lines
2.6 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using UnityEngine;
public class MANAGER_TowerGeneraton : MonoBehaviour
{
[Header("настройки чанков")]
[SerializeField] private List<GameObject> chunkPrefabs;
[SerializeField] private List<GameObject> finalChunkPrefabs;
[SerializeField] private int chunksBeforeFinish = 10;
[Header("связи")]
[SerializeField] private Transform playerTransform;
[SerializeField] private float spawnThreshold = 15f;
[SerializeField] private int initialChunks = 5;
private Vector3 _nextSpawnPoint;
private int _chunksSpawnedCount = 0;
private bool _isFinishSpawned = false;
private Queue<GameObject> _activeChunks = new Queue<GameObject>();
void Start()
{
_nextSpawnPoint = Vector3.zero;
for (int i = 0; i < initialChunks; i++)
{
SpawnNextChunk();
}
}
void Update()
{
if (_isFinishSpawned) return;
if (playerTransform.position.y > _nextSpawnPoint.y - spawnThreshold)
{
SpawnNextChunk();
}
if (_activeChunks.Count > 10)
{
Destroy(_activeChunks.Dequeue());
}
}
private void SpawnNextChunk()
{
GameObject prefabToSpawn = (_chunksSpawnedCount >= chunksBeforeFinish)
? finalChunkPrefabs[Random.Range(0, finalChunkPrefabs.Count)]
: chunkPrefabs[Random.Range(0, chunkPrefabs.Count)];
GameObject newChunk = Instantiate(prefabToSpawn);
// Находим точки входа и выхода в новом чанке
// Важно: в префабах должны быть дочерние объекты с именами "Entrance" и "Exit"
Transform entrance = newChunk.transform.Find("Entrance");
Transform exit = newChunk.transform.Find("Exit");
if (entrance != null && exit != null)
{
// Сдвигаем весь чанк так, чтобы его Entrance совпал с _nextSpawnPoint
Vector3 offset = newChunk.transform.position - entrance.position;
newChunk.transform.position = _nextSpawnPoint + offset;
// Запоминаем точку выхода этого чанка для следующего
_nextSpawnPoint = exit.position;
}
else
{
Debug.LogError($"В префабе {prefabToSpawn.name} не найдены точки Entrance/Exit!");
}
_activeChunks.Enqueue(newChunk);
_chunksSpawnedCount++;
if (_chunksSpawnedCount > chunksBeforeFinish) _isFinishSpawned = true;
}
}