75 lines
2.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|