82 lines
2.4 KiB
C#
82 lines
2.4 KiB
C#
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<GameObject> _activeTiles = new();
|
|
private readonly List<GameObject> _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);
|
|
}
|
|
} |