Комнаты ставятся, но криво
This commit is contained in:
1 parent
0f8a629e4b
commit
85a07065d9
21 files changed
+1193
-1
No files matched your search
@@ -0,0 +1,103 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user