Не пойму, как в принципе может работать такой пул.
1) Вот что-то запрашивает объект, его нет в пуле, начинает загружаться новый ресурс. Проходит несколько кадров, ресурс загружен, инстанцируем объект из этого ресурса и передаем его в метод, который его запрашивал. Так, что ли?
2) Или может запрашивавший метод просто все время тыкается в пустой список пула каждый кадр, пока объект там не появится?
3) Как запомнить, какой метод какой объект вызывал и куда его надо вернуть после загрузки? Самая большая проблема для меня.
4) У меня статический пул, значит IEnumerator'ы я не могу использовать. Хотелось бы сохранить статичность, очень уж удобно вызывать спаун объекта из любого места. Значит, я должен использовать делегаты, предоставляемые ResourceRequest'ами, верно? Я при вызове делегатного метода, убираю его из делегата, чтобы он там больше не висел, правильно? Типа вот так:
Синтаксис:
Используется csharp
static void GetNewEntity(ushort prefabID)
{
resourceRequest = Resources.LoadAsync(folder + prefabID.ToString(), typeof(GameObject));
resourceRequest.completed += OnResourceLoaded;
}
static void OnResourceLoaded(AsyncOperation obj)
{
obj.completed -= OnResourceLoaded;
GameObject newGO = GameObject.Instantiate(resourceRequest.asset as GameObject) as GameObject;
DefaultEntity result = newGO.GetComponent<DefaultEntity>();
Despawn(result);
}
{
resourceRequest = Resources.LoadAsync(folder + prefabID.ToString(), typeof(GameObject));
resourceRequest.completed += OnResourceLoaded;
}
static void OnResourceLoaded(AsyncOperation obj)
{
obj.completed -= OnResourceLoaded;
GameObject newGO = GameObject.Instantiate(resourceRequest.asset as GameObject) as GameObject;
DefaultEntity result = newGO.GetComponent<DefaultEntity>();
Despawn(result);
}
Ужас, что мне всю цепочку методов придется переделывать под асинхронность. Надо было сразу асинхронный пул писать. Подскажите хотя бы, как лучше организовать сам пул. Вот код СИНХРОННОГО пула:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace WorldStreaming
{
public static class PoolManager
{
private static Dictionary<ushort, Queue<DefaultEntity>> poolsDictionary = new Dictionary<ushort, Queue<DefaultEntity>>();
private static string folder = "Streamed/";
public static void Despawn(DefaultEntity target)
{
if (poolsDictionary.ContainsKey(target.prefabID) == false)
{
CreateNewPool(target.prefabID);
}
poolsDictionary[target.prefabID].Enqueue(target);
target.Deactivate();
}
public static DefaultEntity Spawn(ushort prefabID)
{
if (poolsDictionary.ContainsKey(prefabID) == false)
{
CreateNewPool(prefabID);
}
if (poolsDictionary[prefabID].Count > 0)
{
return GetEntityFromPool(prefabID);
}
else
{
return GetNewEntity(prefabID);
}
}
static void CreateNewPool(ushort prefabID)
{
poolsDictionary[prefabID] = new Queue<DefaultEntity>();
}
static DefaultEntity GetEntityFromPool(ushort prefabID)
{
DefaultEntity result = poolsDictionary[prefabID].Dequeue();
result.Activate();
return result;
}
static DefaultEntity GetNewEntity(ushort prefabID)
{
GameObject newGO = GameObject.Instantiate(Resources.Load(folder + prefabID.ToString(), typeof(GameObject))) as GameObject;
DefaultEntity result = newGO.GetComponent<DefaultEntity>();
return result;
}
}
}
using System.Collections.Generic;
using UnityEngine;
namespace WorldStreaming
{
public static class PoolManager
{
private static Dictionary<ushort, Queue<DefaultEntity>> poolsDictionary = new Dictionary<ushort, Queue<DefaultEntity>>();
private static string folder = "Streamed/";
public static void Despawn(DefaultEntity target)
{
if (poolsDictionary.ContainsKey(target.prefabID) == false)
{
CreateNewPool(target.prefabID);
}
poolsDictionary[target.prefabID].Enqueue(target);
target.Deactivate();
}
public static DefaultEntity Spawn(ushort prefabID)
{
if (poolsDictionary.ContainsKey(prefabID) == false)
{
CreateNewPool(prefabID);
}
if (poolsDictionary[prefabID].Count > 0)
{
return GetEntityFromPool(prefabID);
}
else
{
return GetNewEntity(prefabID);
}
}
static void CreateNewPool(ushort prefabID)
{
poolsDictionary[prefabID] = new Queue<DefaultEntity>();
}
static DefaultEntity GetEntityFromPool(ushort prefabID)
{
DefaultEntity result = poolsDictionary[prefabID].Dequeue();
result.Activate();
return result;
}
static DefaultEntity GetNewEntity(ushort prefabID)
{
GameObject newGO = GameObject.Instantiate(Resources.Load(folder + prefabID.ToString(), typeof(GameObject))) as GameObject;
DefaultEntity result = newGO.GetComponent<DefaultEntity>();
return result;
}
}
}