如何将单位排列为六边形布局?附现有螺旋布局实现代码
六边形布局实现方案
要实现你需要的六边形单位排列,可以通过轴向坐标转笛卡尔坐标的方式,将单位按六边形的层(环)来分布,替代原有的螺旋布局逻辑。以下是完整的实现代码及说明:
核心代码
private void FormatHexagonPlacement() { _enemyCount = enemyParent.childCount; float hexSpacing = 2f; // 控制单位之间的间距,可根据需求调整 int index = 0; // 放置中心第一个单位(如果总数大于0) if (index < _enemyCount) { enemyParent.GetChild(index).localPosition = new Vector3(0, enemyParent.GetChild(index).position.y, 0); index++; } // 从第一层(最内层环)开始向外排列 for (int ring = 1; index < _enemyCount; ring++) { int unitsPerRing = 6 * ring; // 每层的单位数量:第n层有6n个单位 for (int i = 0; i < unitsPerRing && index < _enemyCount; i++) { // 计算当前单位所在的六边形边,以及在边上的位置 int side = i / ring; int sidePosition = i % ring; // 确定轴向坐标(q, r)(六边形网格的标准坐标系统) int q, r; switch (side) { case 0: q = ring; r = -sidePosition; break; case 1: q = ring - sidePosition; r = -ring; break; case 2: q = -sidePosition; r = ring - sidePosition; break; case 3: q = -ring; r = sidePosition; break; case 4: q = -ring + sidePosition; r = ring; break; case 5: q = sidePosition; r = ring - sidePosition; break; default: q = 0; r = 0; break; } // 将轴向坐标转换为Unity的3D笛卡尔坐标(Y轴保持单位原有高度) float x = hexSpacing * (1.5f * q); float z = hexSpacing * ((Mathf.Sqrt(3) / 2f) * q + Mathf.Sqrt(3) * r); Vector3 pos = new Vector3(x, enemyParent.GetChild(index).position.y, z); enemyParent.GetChild(index).localPosition = pos; index++; } } }
关键说明
- hexSpacing:调整这个值可以控制单位之间的距离,数值越大,布局越松散。
- 层状排列逻辑:从中心向外,每一层(环)的单位数量是6的倍数(第一层6个,第二层12个,以此类推),单位均匀分布在六边形的6条边上。
- 坐标转换:使用六边形网格的轴向坐标系统转笛卡尔坐标,确保排列出的图形是标准的正六边形,和你需要的布局匹配。
直接替换原有的FormatSpiralPlacement方法即可实现目标布局。
内容的提问来源于stack exchange,提问作者Jaimin
相关产品推荐
相关产品推荐

