Так как количество префабов может исчисляться тысячами и все должно работать в рантайме (динамически загружаемые чанки мира), желательно делать это как можно дешевле:
-не прибегать к отдельной корутине для загрузки каждого элемента массива. Так как получатся тысячи корутин.
-не проверять в повторном цикле состояние КАЖДОГО элемент массива, так как даже из-за одного не успевшего загрузиться префаба, придется впустую бегать по всему массиву каждый кадр, пока этот префаб наконец не загрузится.
Синтаксис:
Используется csharp
public IEnumerator<float> PreloadResources(Chunk chunk)
{
for (int i = 0; i < chunk.entitiesSerialized.Length; i++)
{
ushort prefabID = chunk.entitiesSerialized[i].prefabID;
poolsDictionary[prefabID].resourceRequest = Resources.LoadAsync(prefabID.ToString(), typeof(GameObject));
}
if (ЧТО-ТО ОСТАЛОСЬ НЕ ЗАГРУЖЕННЫМ - КАК УЗНАТЬ?)
{
yield return Timing.WaitForOneFrame;
}
ДЕЛАЕМ ЧТО-ТО ДАЛЕЕ
}
{
for (int i = 0; i < chunk.entitiesSerialized.Length; i++)
{
ushort prefabID = chunk.entitiesSerialized[i].prefabID;
poolsDictionary[prefabID].resourceRequest = Resources.LoadAsync(prefabID.ToString(), typeof(GameObject));
}
if (ЧТО-ТО ОСТАЛОСЬ НЕ ЗАГРУЖЕННЫМ - КАК УЗНАТЬ?)
{
yield return Timing.WaitForOneFrame;
}
ДЕЛАЕМ ЧТО-ТО ДАЛЕЕ
}
Вот примерный набросок кода. Корутина загружает файлы префабов в память, доступ к файлам по prefabID, скрытым в chunk.entitiesSerialized. И сохраняет ResourceRequest в пул объектов. На самом деле, я могу сохранять в пул Object. Мне это нужно, чтобы повторно не вызывать Resources.LoadAsync, а инстансить объекты уже из кэша в синхронном режиме.
Единственное, что мне нужно- наименее накладным способом определить момент, когда все префабы в корутине будут загружены.