когда вы говорите as many GameObjects as possible
Я полагаю, вы имеете в виду без перекрытия?
Это решение работает, если prefab
использует Collider
с.
Я быинстанцировать первый объект всегда и просто получить его ограничительную рамку, чтобы мы знали, насколько он велик
var first = Instantiate(prefab, Vector3.zero + Vector3.right * MinX, Quaternion.identity);
var bounds = new Bounds(Vector3.zero, Vector3.zero);
foreach (var col in first.GetComponentsInChildren<Collider>(true))
{
bounds.Encapsulate(col.bounds);
}
// now you can get the size in X direction
var width = bounds.size.x;
Я подозреваю, что точка поворота вашего префаба, вероятно, будет в центре, поэтому сначала переместите его вправо на половинуего ширины
first.transform.position += Vector3.right * width / 2f;
Теперь вы можете проверить, сколько объектов поместится в заданном диапазоне.Допустим, например, что ширина была 1
, тогда в диапазоне от 0
до 5
было бы в общей сложности 4
объектов.В вычислениях будут некоторые избыточности (добавление 1
, затем уменьшение 1
и т. Д.), Но я оставлю это для лучшего понимания
var minPosition = MinX;
var maxPosition = MaxX;
var actualMinPosition = minPosition + width / 2;
var actualMaxPosition = maxPosition - width / 2;
// +1 here since before we reduced actualMinPosition and actualMaxPosition by
// exactly 1 * width
var possibleAmount = (int)Mathf.Floor((actualMaxPosition - actualMinPosition) / width) + 1;
Так что теперь создайте экземпляры отсутствующих объектов
// since I guess you also want them evenly spread between the start and end position
var distanceBetween = (actualMaxPosition - actualMinPosition) / (possibleAmount - 1);
// поскольку мы уже создали первый экземпляр // мы порождаем только возможнуюAmount - еще 1 для (var i = 0; i <возможныхAmount - 1; i ++) {// +1 здесь, так как мы начали цикл с i =0, но первый // объект здесь фактически является вторым, который будет порожден в общей сложности // поэтому мы хотим, чтобы он уже был перемещен var x = actualMinPosition + distanceBetween * (i + 1); </p>
var obj = Instantiate(prefab, Vector3.zero + Vector3.right * x, Quaternion.identity);
}
Так что все вместе
public void Spawn()
{
var first = Instantiate(prefab, Vector3.zero, Quaternion.identity);
var bounds = new Bounds(Vector3.zero, Vector3.zero);
foreach (var col in first.GetComponentsInChildren<Collider>(true))
{
bounds.Encapsulate(col.bounds);
}
// now you can get the size in X direction
var width = bounds.size.x;
first.transform.position += Vector3.right * width / 2f;
var minPosition = MinX;
var maxPosition = MaxX;
var actualMinPosition = minPosition + width / 2;
var actualMaxPosition = maxPosition - width / 2;
// +1 here since before we reduced actualMinPosition and actualMaxPosition by
// exactly 1 * width
var possibleAmount = (int)Mathf.Floor((actualMaxPosition - actualMinPosition) / width) + 1;
// since I guess you also want them evenly spread between the start and end position
var distanceBetween = (actualMaxPosition - actualMinPosition) / (possibleAmount - 1);
// since we already instantiated the first one
// we spawn only possibleAmount - 1 more
for (var i = 0; i < possibleAmount - 1; i++)
{
// +1 here since we started the loop with i=0 but the first
// object here is actually the second to be spawned in total
// so we want it to be moved already
var x = actualMinPosition + distanceBetween * (i + 1);
var obj = Instantiate(prefab, Vector3.zero + Vector3.right * x, Quaternion.identity);
}
}

Я просто уничтожил и заново вызвал все в Update
для этой демонстрации