using System.Collections.Generic; using UnityEngine; public class LevelBuilder : MonoBehaviour { [Header("Tile Settings")] [SerializeField] private GameObject[] tilePrefabs; [SerializeField] private float tileLength = 6f; [SerializeField] private int numberOfTiles = 20; [SerializeField] private Transform playerTransform; [Header("Environment Settings")] [SerializeField] private GameObject[] treePrefabs; [SerializeField] private float sideOffset = 10f; [SerializeField] private float treeRandomSpread = 2f; private readonly List _activeTiles = new(); private readonly List _activeEnvironment = new(); private float _spawnZ; private void Start() { for (var i = 0; i < numberOfTiles; i++) { SpawnTile(i < 5 ? 0 : Random.Range(0, tilePrefabs.Length)); } } private void Update() { if (playerTransform.position.z - 35 > _spawnZ - numberOfTiles * tileLength) { SpawnTile(Random.Range(0, tilePrefabs.Length)); DeleteTile(); } } private void SpawnTile(int tileIndex) { var tile = Instantiate(tilePrefabs[tileIndex], transform.forward * _spawnZ, transform.rotation); _activeTiles.Add(tile); SpawnEnvironment(_spawnZ); _spawnZ += tileLength; } private void SpawnEnvironment(float zPos) { var envContainer = new GameObject("EnvGroup_" + zPos); envContainer.transform.SetParent(transform); CreateTree(-sideOffset, zPos, envContainer.transform); CreateTree(sideOffset, zPos, envContainer.transform); _activeEnvironment.Add(envContainer); } private void CreateTree(float xOffset, float zPos, Transform parent) { if (treePrefabs.Length == 0) return; var finalX = xOffset + Random.Range(-treeRandomSpread, treeRandomSpread); var finalZ = zPos + Random.Range(-treeRandomSpread, treeRandomSpread); var spawnPos = new Vector3(finalX, 0, finalZ); var treePrefab = treePrefabs[Random.Range(0, treePrefabs.Length)]; var tree = Instantiate(treePrefab, spawnPos, Quaternion.Euler(0, Random.Range(0, 360), 0)); tree.transform.SetParent(parent); } private void DeleteTile() { Destroy(_activeTiles[0]); _activeTiles.RemoveAt(0); Destroy(_activeEnvironment[0]); _activeEnvironment.RemoveAt(0); } }