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

75 lines
2.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Code.Configs;
using Code.Gameplay.Orders.Order;
using Cysharp.Threading.Tasks;
using Reflex.Extensions;
using Reflex.Injectors;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;
using Object = System.Object;
using Random = UnityEngine.Random;
namespace Code.Generator
{
public class RoomGeneratorFactory : IRoomGeneratorFactory
{
private AsyncOperationHandle<IList<GameObject>> _roomsHandle;
private readonly AssetReference[] _roomAssetReferences;
private Dictionary<RoomType, List<GameObject>> _cashedRooms = new();
public RoomGeneratorFactory(GeneratorConfig generatorConfig)
{
_roomAssetReferences = generatorConfig.roomAssetReferences;
// _cashedRooms = new GameObject[_roomAssetReferences.Length];
_cashedRooms.Add(RoomType.Basic, new());
_cashedRooms.Add(RoomType.Save, new ());
_cashedRooms.Add(RoomType.PickUp, new ());
_cashedRooms.Add(RoomType.Initial, new ());
}
public async UniTask PreloadRooms(IOrderService orderService)
{
_roomsHandle =
Addressables.LoadAssetsAsync<GameObject>(_roomAssetReferences, OnRoomLoaded, Addressables.MergeMode.Union);
await _roomsHandle.ToUniTask();
// _cashedRooms = rooms.ToArray(); var rooms =
// Debug.Log($"Комнат в памяти есть: {_cashedRooms.Length}");
}
private void OnRoomLoaded(GameObject room)
{
var temp = room.GetComponent<Room>();
_cashedRooms[temp.RoomType].Add(room);
}
public GameObject GetCachedPrefab(int index, RoomType roomType)
{
if (index < 0 || index >= _cashedRooms[roomType].Count)
return null;
return _cashedRooms[roomType][index];
}
public GameObject GetRandomCachedPrefabOfType(RoomType roomType, out int index)
{
index = Random.Range(0, _cashedRooms[roomType].Count);
return _cashedRooms[roomType][index];
}
public int GetRandomIndexOfType(RoomType roomType) => Random.Range(0, _cashedRooms[roomType].Count);
public Room CreateRoomByIndex(int index, RoomType roomType)
{
var room = UnityEngine.Object.Instantiate(_cashedRooms[roomType][index]);
return room.GetComponent<Room>();
}
public void ReleaseRooms()
{
_roomsHandle.Release();
}
}
}