Files
CourierOld/Game/CourierOld/Assets/Code/Generator/RoomGenerator.cs
T

104 lines
3.4 KiB
C#

using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Code.Generator
{
public class RoomGenerator : MonoBehaviour
{
[SerializeField] private GeneratorConfig generatorConfig;
private RoomGeneratorFactory _factory;
private float _timer;
private List<int> _roomIndexesStack;
private List<Room> _spawnedRooms;
private async void Awake()
{
_factory = new RoomGeneratorFactory(generatorConfig);
_spawnedRooms = new List<Room>();
_roomIndexesStack = new List<int>();
_timer = Random.Range(60, 120f);
Debug.LogWarning($"КОТЛЫ ГЕНЕРАЛЬСКИЕ{_timer}");
await _factory.PreloadRooms();
CreateRoomsStack();
await GenerateRoomsAsync();
}
private void CreateRoomsStack()
{
var remainingTime = _timer;
int totalRooms = generatorConfig.roomAssetReferences.Length;
List<int> availableIndexes = new List<int>();
for (int i = 0; i < totalRooms; i++)
availableIndexes.Add(i);
while (remainingTime > 0 && availableIndexes.Count > 0)
{
int randomIndex = Random.Range(0, availableIndexes.Count);
int chosenOne = availableIndexes[randomIndex];
availableIndexes.RemoveAt(randomIndex);
var prefab = _factory.GetCachedPrefab(chosenOne);
if (prefab == null)
continue;
Room room = prefab.GetComponent<Room>();
if (room == null)
continue;
float currentRoomTime = room.RoomTimer;
if (remainingTime >= currentRoomTime)
{
_roomIndexesStack.Add(chosenOne);
remainingTime -= currentRoomTime;
Debug.Log($"комната {room.name} время {currentRoomTime} осталось: {remainingTime}");
}
}
Debug.Log($"стек комнат: {_roomIndexesStack.Count}");
}
private async UniTask GenerateRoomsAsync()
{
for (int i = 0; i < _roomIndexesStack.Count; i++)
{
int index = _roomIndexesStack[i];
Room room = await _factory.CreateRoomByIndex(index);
if (i == 0)
{
room.transform.position = Vector3.zero;
room.transform.rotation = Quaternion.identity;
}
else
{
Room previousRoom = _spawnedRooms[i - 1];
PlaceRoom(room, previousRoom);
}
_spawnedRooms.Add(room);
}
}
private void PlaceRoom(Room current, Room previous)
{
if (current.EnterMarker == null || previous.ExitMarker == null)
return;
Transform enter = current.EnterMarker;
Transform exit = previous.ExitMarker;
Quaternion rotationDiff = Quaternion.FromToRotation(enter.forward, exit.forward);
current.transform.rotation = rotationDiff * current.transform.rotation;
Vector3 offset = enter.localPosition;
current.transform.position = exit.position - offset;
}
}
}