diff --git a/Game/CourierOld/Assets/Code/Generator/IRoomGeneratorFactory.cs b/Game/CourierOld/Assets/Code/Generator/IRoomGeneratorFactory.cs index 995a875..7865f84 100644 --- a/Game/CourierOld/Assets/Code/Generator/IRoomGeneratorFactory.cs +++ b/Game/CourierOld/Assets/Code/Generator/IRoomGeneratorFactory.cs @@ -8,5 +8,6 @@ namespace Code.Generator UniTask PreloadRooms(); GameObject GetCachedPrefab(int index); UniTask CreateRoomByIndex(int index); + void ReleaseRoom(Room room); } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Generator/RoomGenerator.cs b/Game/CourierOld/Assets/Code/Generator/RoomGenerator.cs index 44b9855..3daf48e 100644 --- a/Game/CourierOld/Assets/Code/Generator/RoomGenerator.cs +++ b/Game/CourierOld/Assets/Code/Generator/RoomGenerator.cs @@ -1,38 +1,66 @@ using System.Collections.Generic; +using Code.Gameplay.Orders.Order; using Cysharp.Threading.Tasks; +using Reflex.Attributes; using UnityEngine; namespace Code.Generator { public class RoomGenerator : MonoBehaviour { + [Inject] private IOrderService _orderService; + [SerializeField] private GeneratorConfig generatorConfig; private RoomGeneratorFactory _factory; - private float _timer; private List _roomIndexesStack; private List _spawnedRooms; + private int _nextRoomStackIndex; + private async void Awake() { _factory = new RoomGeneratorFactory(generatorConfig); _spawnedRooms = new List(); _roomIndexesStack = new List(); - _timer = Random.Range(60, 120f); - Debug.LogWarning($"КОТЛЫ ГЕНЕРАЛЬСКИЕ{_timer}"); + Debug.LogWarning($"КОТЛЫ ГЕНЕРАЛЬСКИЕ{_orderService.DeliveryTimer}"); await _factory.PreloadRooms(); - CreateRoomsStack(); - await GenerateRoomsAsync(); + CreateRoomsStack(); + await SpawnInitialRoomsAsync(); } + private void OnEnable() + { + RoomTrigger.PlayerEnteredRoom += OnPlayerEntered; + } + + private void OnDisable() + { + RoomTrigger.PlayerEnteredRoom -= OnPlayerEntered; + } + + public async void OnPlayerEntered() + { + await SpawnNextRoomAsync(); + + if (_spawnedRooms.Count > 2) + { + Room roomToRemove = _spawnedRooms[0]; + _spawnedRooms.RemoveAt(0); + + _factory.ReleaseRoom(roomToRemove); + Destroy(roomToRemove.gameObject); + } + } + private void CreateRoomsStack() { _roomIndexesStack.Clear(); - var remainingTime = _timer; + var remainingTime = _orderService.DeliveryTimer; float ladderTimer = 0f; int totalRooms = generatorConfig.roomAssetReferences.Length; List availableIndexes = new List(); @@ -109,26 +137,36 @@ namespace Code.Generator Debug.Log($"стек комнат: {_roomIndexesStack.Count}"); } - private async UniTask GenerateRoomsAsync() + private async UniTask SpawnInitialRoomsAsync() { - for (int i = 0; i < _roomIndexesStack.Count; i++) + _nextRoomStackIndex = 0; + + await SpawnNextRoomAsync(); + + await SpawnNextRoomAsync(); + } + + private async UniTask SpawnNextRoomAsync() + { + if (_nextRoomStackIndex >= _roomIndexesStack.Count) + return; + + int index = _roomIndexesStack[_nextRoomStackIndex]; + Room room = await _factory.CreateRoomByIndex(index); + + if (_spawnedRooms.Count == 0) { - 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); + room.transform.position = Vector3.zero; + room.transform.rotation = Quaternion.identity; } + else + { + Room previousRoom = _spawnedRooms[_spawnedRooms.Count - 1]; + PlaceRoom(room, previousRoom); + } + + _spawnedRooms.Add(room); + _nextRoomStackIndex++; } private int FindRoomIndexByType(RoomType neededType) @@ -170,7 +208,7 @@ namespace Code.Generator if (_roomIndexesStack.Count == 0) { - Debug.LogWarning("стек пуст, нет позиции после первой"); + Debug.LogWarning("Стек пуст, нет позиции после первой"); return; } diff --git a/Game/CourierOld/Assets/Code/Generator/RoomGeneratorFactory.cs b/Game/CourierOld/Assets/Code/Generator/RoomGeneratorFactory.cs index 0de4ac5..ee7da32 100644 --- a/Game/CourierOld/Assets/Code/Generator/RoomGeneratorFactory.cs +++ b/Game/CourierOld/Assets/Code/Generator/RoomGeneratorFactory.cs @@ -2,6 +2,7 @@ using Code.Configs; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; +using Object = System.Object; namespace Code.Generator { @@ -30,7 +31,7 @@ namespace Code.Generator } _isInitialized = true; - Debug.Log($"комнат в памяти есть: {_cashedRooms.Length}"); + Debug.Log($"Комнат в памяти есть: {_cashedRooms.Length}"); } public GameObject GetCachedPrefab(int index) @@ -45,8 +46,12 @@ namespace Code.Generator if (!_isInitialized) await PreloadRooms(); - Room room = Object.Instantiate(_cashedRooms[index]).GetComponent(); - return room; + return (await Addressables.InstantiateAsync(_roomAssetReferences[index]).ToUniTask()).GetComponent(); + } + + public void ReleaseRoom(Room room) + { + Addressables.Release(room); } } } diff --git a/Game/CourierOld/Assets/Code/Generator/RoomTrigger.cs b/Game/CourierOld/Assets/Code/Generator/RoomTrigger.cs new file mode 100644 index 0000000..ab45512 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Generator/RoomTrigger.cs @@ -0,0 +1,28 @@ +using System; +using Code.Gameplay.Orders.Order; +using Reflex.Attributes; +using UnityEngine; + +namespace Code.Generator +{ + public class RoomTrigger : MonoBehaviour + { + [Inject] private OrderService _orderService; + + public static event Action PlayerEnteredRoom; + + private bool _playerEntered; + + private void OnTriggerEnter(Collider other) + { + if (_playerEntered) return; + if (!other.CompareTag("Player")) return; + + _playerEntered = true; + + _orderService.RoomPassed(); + + PlayerEnteredRoom?.Invoke(); + } + } +} \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Generator/RoomTrigger.cs.meta b/Game/CourierOld/Assets/Code/Generator/RoomTrigger.cs.meta new file mode 100644 index 0000000..7d788ab --- /dev/null +++ b/Game/CourierOld/Assets/Code/Generator/RoomTrigger.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4207b7568dc3482393ac1860a31909b4 +timeCreated: 1764087485 \ No newline at end of file