Это продолжение другого вопроса, который я разместил ранее. Найденное там решение привело к новой проблеме, которую я опишу здесь.
Создание объектов со случайным размером в пределах заданного диапазона с одинаковым расстоянием между ними независимо от частоты кадров
Я пытаюсь создать эффект нескольких зданий разных размеров, движущихся слева направо с постоянной скоростью, независимо от частоты кадров. Я хочу, чтобы расстояние между зданиями было одинаковым независимо от размера, и размер каждого здания рандомизирован в пределах диапазона.
Я решил это, сравнив размер последнего здания с текущим и разделив его на их скорость, которая изначально работала, но была очень тяжелой для производительности из-за постоянного создания экземпляров префабов. Это исходный код из моего скрипта ScrollingCity.
if(Time.time > nextBuilding)
{
spawningRatio = ((randomSize / 2) + (buildingPrefab.transform.localScale.x / 2) + distanceBetween) / (speed);
nextBuilding = Time.time + spawningRatio;
buildingPrefab.transform.localScale = new Vector3(randomSize, randomSize, randomSize);
Instantiate(buildingPrefab, spawnPoint.transform.position, Quaternion.identity);
randomSize = Random.Range(ranMin, ranMax);
}
В связанном потоке мне посоветовали использовать пул для моих объектов, чтобы уменьшить нагрузку, и я смог заставить его работать с использованием некоторые учебники. Однако теперь я не знаю, как сравнить размеры последних с объектами, извлеченными из пула, чтобы убедиться, что все они имеют одинаковый интервал между ними.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPooler : MonoBehaviour
{
[System.Serializable]
public class Pool
{
public string tag;
public GameObject prefab;
public int size;
}
#region Singleton
public static ObjectPooler Instance;
private void Awake()
{
Instance = this;
}
#endregion
public List<Pool> pools;
public Dictionary<string, Queue<GameObject>> poolDictionary;
private void Start()
{
poolDictionary = new Dictionary<string, Queue<GameObject>>();
foreach (Pool pool in pools)
{
Queue<GameObject> objectPool = new Queue<GameObject>();
for (int i = 0; i < pool.size; i++)
{
GameObject obj = Instantiate(pool.prefab);
obj.SetActive(false);
objectPool.Enqueue(obj);
}
poolDictionary.Add(pool.tag, objectPool);
}
}
public GameObject SpawnFromPool (string tag, Vector3 position, Quaternion rotation)
{
if (!poolDictionary.ContainsKey(tag))
{
Debug.LogWarning("Tag doesn't exist");
return null;
}
GameObject objectToSpawn = poolDictionary[tag].Dequeue();
objectToSpawn.SetActive(true);
objectToSpawn.transform.position = position;
objectToSpawn.transform.rotation = rotation;
poolDictionary[tag].Enqueue(objectToSpawn);
return objectToSpawn;
}
}
Это сценарий для моего Object Pooler, изученный из учебника.
Затем я вызываю функцию в моем ScrollingCity Script, где я пытаюсь получить значение преобразования последнего созданного объекта, чтобы я мог сравнить их с текущий объект, но я могу получить преобразование только первого объекта, пока он не достигнет конца очереди.
if (Time.time> nextBuilding) {
nextBuilding = Time.time + spawningRatio;
objectPooler.SpawnFromPool("Build", transform.position, Quaternion.identity);
lastBuilding = objectPooler.SpawnFromPool("Build", transform.position, Quaternion.identity);
Debug.Log(lastBuilding.transform.localScale);
}
И он возвращает преобразование только первого объекта в журнале:
Итак, мой вопрос в том, как я могу получить доступ к масштабу последнего объекта в Очередь и сравните ее с текущим, чтобы контролировать частоту их создания и эффективно поддерживать одинаковое расстояние между каждым объектом независимо от масштаба?