using UnityEngine; using System.Collections.Generic; public class LevelGenerator : MonoBehaviour { public GameObject platformPrefab; public Transform playerTransform; public int numberOfPlatforms = 5; public float platformLength = 50f; public GameObject coinPrefab; public GameObject obstaclePrefab; // Теперь будем хранить пары: платформа и список объектов на ней private Dictionary> platformItems = new Dictionary>(); private List activePlatforms = new List(); private float spawnPosition = 0f; void Start() { for (int i = 0; i < numberOfPlatforms; i++) { SpawnPlatform(); } } void Update() { if (playerTransform.position.z - platformLength > spawnPosition - (numberOfPlatforms * platformLength)) { SpawnPlatform(); DeleteOldestPlatform(); } } private void SpawnPlatform() { GameObject newPlatform = Instantiate(platformPrefab, Vector3.forward * spawnPosition, Quaternion.Euler(0, 90, 0)); activePlatforms.Add(newPlatform); // Создаем список для хранения объектов на этой платформе platformItems[newPlatform] = new List(); PopulatePlatform(newPlatform); spawnPosition += platformLength; } private void PopulatePlatform(GameObject platform) { int itemCount = Random.Range(3, 8); for (int i = 0; i < itemCount; i++) { GameObject itemToSpawn = Random.Range(0, 3) > 0 ? coinPrefab : obstaclePrefab; if (itemToSpawn != null) { float randomX = Random.Range(-4f, 4f); float randomZ = Random.Range(-platformLength / 2 + 5, platformLength / 2 - 5); Vector3 spawnPos = new Vector3( platform.transform.position.x + randomX, 1f, platform.transform.position.z + randomZ ); // Создаем объект без родителя, чтобы избежать растягивания GameObject newItem = Instantiate(itemToSpawn, spawnPos, Quaternion.identity); // Добавляем созданный объект в список для последующего удаления platformItems[platform].Add(newItem); } } } private void DeleteOldestPlatform() { GameObject platformToDelete = activePlatforms[0]; // Удаляем все объекты, связанные с этой платформой if (platformItems.ContainsKey(platformToDelete)) { foreach (GameObject item in platformItems[platformToDelete]) { Destroy(item); } platformItems.Remove(platformToDelete); } // Удаляем саму платформу Destroy(platformToDelete); activePlatforms.RemoveAt(0); } }