Как сгенерировать сетку в форме сот в Unity?
Нужна подобная сетка из правильных шестиугольников (в форме сот):
Я написал код, который генерирует следующую неверную сетку:
Мой код:
[ContextMenu("Generate grid")]
public void GenerateGrid()
{
for(int x = 0; x < _gridSize.x; x++)
{
for (int z = 0; z < _gridSize.z; z++)
{
var meshSize = _cell.GetComponent<MeshRenderer>().bounds.size;
var position = new Vector3(x * (meshSize.x + _offset), 0, z * (meshSize.z + _offset));
var cell = Instantiate(_cell, position, Quaternion.Euler(_rotationOffset), _parent.transform);
cell.Position = new Vector2(x, z);
cell.name = $"Cell: x:{x}, z:{z}";
GridActions.AllCell.Add(cell);
}
}
}
Как генерировать именно сетку с первого скриншота?
Ответы (1 шт):
Автор решения: Максим Фисман
→ Ссылка
Основные простые расчеты приведены на чертеже, я лишь запишу получившиеся данные:
AB=sqrt(3)/2
BC=3a/2
Будем спавнить шестиугольники следующим образом:
- Идем по горизонтали, спавним шестигольуники со сдвигом
sqrt(3)/2 - Когда линия заканчивается переходим на линию вверх (на
3a/2) - Переходе между линиями первый слева шестиугольник будем спавнить то на
a*sqrt(3)/2влево, то на это же значение вправо.
У меня получился такой код, который спавнит шестиугольники по осям XZ, оставляя Y постоянным.
public Vector2Int FieldSize;
public Vector3 InitPos; // Позиция левого нижнего тайла
public float HexagonSide; // Сторона шестиугольника (`а` на чертеже)
public GameObject Hexagon; // Префаб
private void Start()
{
Vector2 Offset = new Vector2(Mathf.Sqrt(3) * HexagonSide,
3 / 2f * HexagonSide); // Сдвиги по X и Y
float LinesOffsetX = Mathf.Sqrt(3) / 2 * HexagonSide; // Сдвиг по X между линиями
float currLineOffset = 0; // Сдвиг по X на НЫНЕШНЕЙ линии
for (int i = 0; i < FieldSize.x; i++)
{
for (int j = 0; j < FieldSize.y; j++)
{
Vector3 pos = new Vector3(InitPos.x + Offset.x * j + currLineOffset,
InitPos.y,
InitPos.z + Offset.y * i);
Instantiate(Hexagon, pos, ...); // Последующие параметры кастомны
}
currLineOffset = (currLineOffset == 0 ? LinesOffsetX : 0);
}
}
Спавнить шестиугольники можно и по-другому, перпедикулярно от моего решения. В таком случае сдвиги будут немного другие.
Комментарий по поводу именно вашего кода:
- Очевидно, что вы используете шестиугольники одинаковых размеров, так что получение этих самых размеров лучше вынести из двойного цикла (первая строка тела цикла).


