У нас есть родительский объект, назовем его RectangleParent
, и мы хотим разместить дочерние объекты, в нашем случае Squares
(общее значение, определенное во время выполнения в диапазоне 1-10) в пределах этой поверхности.Как внутри границ нашего родительского объекта, RectangleParent
, равномерно отстоящих друг от друга, так и слева направо максимум в две строки (максимум 5 элементов в строке, максимум в две строки, равно максимум 10 квадратных).
EDIT начало
end EDIT
ОбразецUnity pkg здесь
Правильный пример (ы):
Десять (10) объектов для размещения
Пять (5) объектов для размещения
Текущий результат
Обратите внимание на наш родительский объект в начале координат (родительские объекты - это вытянутые прямоугольники, дочерние объекты - меньшие квадраты).Это дети расставлены по желанию, отвечающие всем требованиям.Размещенные в пределах родительских границ, Два ряда равномерно отстоят друг от друга в пределах родительских границ, и Каждый дочерний объект равномерно расположен друг от друга.Как показано в примере с Десятью (10) объектами.
Но затем обратите внимание, что для родительского объекта, не расположенного в источнике - дочерних объектов (квадратов), не расположенных в пределах границ своих родителей, расстояние между двумя строками невписывается в границы родителей, и объекты больше не являются квадратами (теперь они выглядят как прямоугольники).Однако дочерние объекты в каждой строке равномерно распределены между собой, поэтому здесь встречается хотя бы одно желание.
Если мы назначим Cube.transform
.localPosition вместо .position
В начале координат: интервал между строками по-прежнему корректен, но теперь интервал между дочерними объектами (квадратами) в каждой строке неверен, а также вседочерние объекты не выходят за пределы своих родителей.
Вдали от источника: две строки выровнены правильно, но интервал между двумя строками неверен.Две строки не вписываются в границы своих родительских объектов.Сами дочерние объекты имеют множество проблем.Они не являются квадратами, и их интервалы между ними неверны.
Так что же не так с нашей математикой размещения 3d?Как исправить размещение нашего объекта так, чтобы независимо от того, где находится наш родительский объект, наши дети помещались в пределах границ своего родителя?
Код
public class NewBehaviourScript : MonoBehaviour {
public int NumberOfObjectsToPlace = 10; //Place 10 objects
public int maxRows = 5; // how many objects can be placed in a row
public int maxColumns = 2; // how many objects can be placed in a column
public GameObject RectangleParent; //the parentObject instance
public GameObject CubePrefab; //the cube prefab
// Use this for initialization
void Start () {
PlaceObjects();
}
// Update is called once per frame
void Update () {
}
void PlaceObjects()
{
Vector3 center = RectangleParent.GetComponent<MeshRenderer>().bounds.center;
Vector3 size = RectangleParent.GetComponent<MeshRenderer>().bounds.size;
Vector3 corner = -new Vector3(size.x / 2, 0, size.z / 2);
float stepX = size.x / (maxColumns + 1);
float stepZ = size.z / (maxRows + 2);
int placedObjects = NumberOfObjectsToPlace;
for (int i = 0; i < placedObjects; i++)
{
GameObject Cube = Instantiate(CubePrefab);
Cube.transform.parent = RectangleParent.transform;
Cube.transform.localRotation = Quaternion.identity;
Cube.transform.position = corner + new Vector3(stepX,
center.y + 0.15f,
stepZ * 1.5f + i * stepZ
);
if (i == maxRows - 1)
{
i -= maxRows;
placedObjects -= maxRows;
stepX += size.x / (maxColumns + 1);
}
}
}
}
(спасибо @ Али-Бабе за помощь)