better level

This commit is contained in:
MrTorex committed 2026-03-07 13:19:44 +03:00
1 parent a925c191e2
commit 4a8a8ae916
40 files changed
+8471 -143

No files matched your search

+100 -59
View File
@@ -1,82 +1,123 @@
using System.Collections.Generic;
using UnityEngine;
public class LevelBuilder : MonoBehaviour
namespace Code.Gameplay.Level
{
[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()
public class LevelBuilder : MonoBehaviour
{
for (var i = 0; i < numberOfTiles; i++)
[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;
[Header("Obstacles Settings")] [SerializeField]
private GameObject[] lowObstacles;
[SerializeField] private GameObject[] highObstacles;
[SerializeField] private GameObject[] movingLowObstacles;
[SerializeField] private GameObject[] movingHighObstacles;
[Range(0, 100)] [SerializeField] private int obstacleChance = 40;
[SerializeField] private float laneDistance = 5f;
private readonly List<GameObject> _activeTiles = new();
private readonly List<GameObject> _activeEnvironment = new();
private float _spawnZ;
private void Start()
{
SpawnTile(i < 5 ? 0 : Random.Range(0, tilePrefabs.Length));
for (var i = 0; i < numberOfTiles; i++)
{
SpawnTile(i < 10 ? 0 : Random.Range(0, tilePrefabs.Length), i >= 10);
}
}
}
private void Update()
{
if (playerTransform.position.z - 35 > _spawnZ - numberOfTiles * tileLength)
private void Update()
{
SpawnTile(Random.Range(0, tilePrefabs.Length));
DeleteTile();
if (playerTransform.position.z - 35 > _spawnZ - numberOfTiles * tileLength)
{
SpawnTile(Random.Range(0, tilePrefabs.Length), true);
DeleteTile();
}
}
}
private void SpawnTile(int tileIndex)
{
var tile = Instantiate(tilePrefabs[tileIndex], transform.forward * _spawnZ, transform.rotation);
_activeTiles.Add(tile);
private void SpawnTile(int tileIndex, bool spawnItems)
{
var tile = Instantiate(tilePrefabs[tileIndex], transform.forward * _spawnZ, transform.rotation);
_activeTiles.Add(tile);
SpawnEnvironment(_spawnZ);
SpawnEnvironment(_spawnZ);
_spawnZ += tileLength;
}
if (spawnItems)
{
SpawnObstacle(_spawnZ);
}
private void SpawnEnvironment(float zPos)
{
var envContainer = new GameObject("EnvGroup_" + zPos);
envContainer.transform.SetParent(transform);
_spawnZ += tileLength;
}
CreateTree(-sideOffset, zPos, envContainer.transform);
CreateTree(sideOffset, zPos, envContainer.transform);
private void SpawnObstacle(float zPos)
{
if (Random.Range(0, 100) > obstacleChance) return;
_activeEnvironment.Add(envContainer);
}
var lane = Random.Range(-1, 2);
var spawnPos = new Vector3(lane * laneDistance, 0, zPos);
private void CreateTree(float xOffset, float zPos, Transform parent)
{
if (treePrefabs.Length == 0) return;
var type = Random.Range(0, 4);
var finalX = xOffset + Random.Range(-treeRandomSpread, treeRandomSpread);
var finalZ = zPos + Random.Range(-treeRandomSpread, treeRandomSpread);
var spawnPos = new Vector3(finalX, 0, finalZ);
var prefab = type switch
{
0 => GetRandom(lowObstacles),
1 => GetRandom(highObstacles),
2 => GetRandom(movingLowObstacles),
3 => GetRandom(movingHighObstacles),
_ => null
};
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);
}
if (prefab)
{
var obs = Instantiate(prefab, spawnPos, Quaternion.Euler(0, 180, 0));
obs.transform.SetParent(_activeTiles[^1].transform);
}
}
private void DeleteTile()
{
Destroy(_activeTiles[0]);
_activeTiles.RemoveAt(0);
private GameObject GetRandom(GameObject[] array)
{
return array.Length > 0 ? array[Random.Range(0, array.Length)] : null;
}
Destroy(_activeEnvironment[0]);
_activeEnvironment.RemoveAt(0);
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 spawnPos = new Vector3(xOffset + Random.Range(-treeRandomSpread, treeRandomSpread), 0,
zPos + Random.Range(-treeRandomSpread, treeRandomSpread));
var tree = Instantiate(treePrefabs[Random.Range(0, treePrefabs.Length)], 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);
}
}
}
@@ -0,0 +1,10 @@
using UnityEngine;
namespace Code.Gameplay.Level
{
public class MovingObstacle : MonoBehaviour
{
public float speed = 5f;
private void Update() => transform.Translate(Vector3.forward * (speed * Time.deltaTime));
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 200a8834ca774fcaa01e325f2a8dd670
timeCreated: 1772876845
+60 -57
View File
@@ -1,73 +1,76 @@
using UnityEngine;
public class PlayerController : MonoBehaviour
namespace Code.Gameplay.Player
{
[SerializeField] private float forwardSpeed = 10f;
[SerializeField] private float laneDistance = 3.0f;
[SerializeField] private float jumpForce = 8f;
[SerializeField] private float gravity = 20f;
private int _targetLane = 1;
private CharacterController _controller;
private Vector3 _direction;
private void Start()
public class PlayerController : MonoBehaviour
{
_controller = GetComponent<CharacterController>();
}
[SerializeField] private float forwardSpeed = 10f;
[SerializeField] private float laneDistance = 5f;
[SerializeField] private float jumpForce = 8f;
[SerializeField] private float gravity = 20f;
private void Update()
{
if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))
private int _targetLane = 1;
private CharacterController _controller;
private Vector3 _direction;
private void Start()
{
_targetLane = Mathf.Min(_targetLane + 1, 2);
}
else if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A))
{
_targetLane = Mathf.Max(_targetLane - 1, 0);
_controller = GetComponent<CharacterController>();
}
var targetPosition = transform.position.z * transform.forward + transform.position.y * transform.up;
switch (_targetLane)
private void Update()
{
case 0:
targetPosition += Vector3.left * laneDistance;
break;
case 2:
targetPosition += Vector3.right * laneDistance;
break;
}
if (_controller.isGrounded)
{
_direction.y = -1f;
if (Input.GetKeyDown(KeyCode.Space))
if (UnityEngine.Input.GetKeyDown(KeyCode.RightArrow) || UnityEngine.Input.GetKeyDown(KeyCode.D))
{
_direction.y = jumpForce;
_targetLane = Mathf.Min(_targetLane + 1, 2);
}
else if (UnityEngine.Input.GetKeyDown(KeyCode.LeftArrow) || UnityEngine.Input.GetKeyDown(KeyCode.A))
{
_targetLane = Mathf.Max(_targetLane - 1, 0);
}
var targetPosition = transform.position.z * transform.forward + transform.position.y * transform.up;
switch (_targetLane)
{
case 0:
targetPosition += Vector3.left * laneDistance;
break;
case 2:
targetPosition += Vector3.right * laneDistance;
break;
}
if (_controller.isGrounded)
{
_direction.y = -1f;
if (UnityEngine.Input.GetKeyDown(KeyCode.Space))
{
_direction.y = jumpForce;
}
}
else
{
_direction.y -= gravity * Time.deltaTime;
}
_direction.z = forwardSpeed;
var diff = targetPosition - transform.position;
var moveDir = diff.normalized * (25f * Time.deltaTime);
var moveX = Mathf.Clamp(diff.x, -moveDir.magnitude, moveDir.magnitude);
var finalMove = new Vector3(moveX, _direction.y * Time.deltaTime, _direction.z * Time.deltaTime);
_controller.Move(finalMove);
}
else
public void IncreaseSpeed(float amount)
{
_direction.y -= gravity * Time.deltaTime;
forwardSpeed += amount;
}
_direction.z = forwardSpeed;
var diff = targetPosition - transform.position;
var moveDir = diff.normalized * (25f * Time.deltaTime);
var moveX = Mathf.Clamp(diff.x, -moveDir.magnitude, moveDir.magnitude);
var finalMove = new Vector3(moveX, _direction.y * Time.deltaTime, _direction.z * Time.deltaTime);
_controller.Move(finalMove);
}
public void IncreaseSpeed(float amount)
{
forwardSpeed += amount;
}
}