Unity蜂窝状六边形螺旋环生成问题及代码调试
蜂窝六边形螺旋环生成问题修复
问题根源
你的代码存在两个核心问题导致布局错位、间距不均:
- 移动向量与六边形尺寸的关联逻辑错误,
HexSide仅基于预制体缩放计算,未匹配正六边形的几何间距规则; - 第4个方向的额外生成逻辑打破了每层6个方向的均匀分布,导致每层六边形数量不是6的倍数,且位置偏移;
- 初始中心六边形(第0层)未正确生成。
修复后的代码
using UnityEngine; public class GenerateHexFloor : MonoBehaviour { public GameObject Hexagon; public uint Radius; public float HexSideLength = 1f; // 直接指定六边形边长,逻辑更直观 // 正六边形轴向坐标系的标准移动向量 private readonly Vector2[] _directionVectors = { new Vector2(1, 0), // 右 new Vector2(0.5f, 0.866f),// 右上 new Vector2(-0.5f, 0.866f),// 左上 new Vector2(-1, 0), // 左 new Vector2(-0.5f, -0.866f),// 左下 new Vector2(0.5f, -0.866f) // 右下 }; void Start() { if (Hexagon.transform.localScale.x != Hexagon.transform.localScale.y) { Debug.LogError("六边形预制体缩放非均匀,无法生成正确布局,终止执行"); return; } // 计算六边形间的实际间距(基于边长) float hexSpacing = HexSideLength * 2; // 统一预制体缩放,确保边长符合设定 Hexagon.transform.localScale = Vector3.one * HexSideLength; // 生成中心六边形(第0层) Instantiate(Hexagon, transform.position, Quaternion.identity, transform).name = "Hex Layer: 0, n: 1"; Vector2 currentPosition = transform.position; for (int layer = 1; layer <= Radius; layer++) { // 定位当前层起始位置(中心右侧第一个点) currentPosition = transform.position + new Vector2(layer * hexSpacing, 0); int hexCount = 0; for (int dir = 0; dir < 6; dir++) { // 每个方向生成layer个六边形,每层总数为6*layer for (int i = 0; i < layer; i++) { hexCount++; Instantiate(Hexagon, currentPosition, Quaternion.identity, transform).name = $"Hex Layer: {layer}, n: {hexCount}"; currentPosition += _directionVectors[dir] * hexSpacing; } } } } }
关键修复说明
- 标准坐标系:采用正六边形轴向坐标系的移动向量,确保每个方向的移动距离一致,从根源保证间距均匀;
- 直观尺寸控制:通过
HexSideLength直接指定边长,自动调整预制体缩放,避免缩放与移动逻辑脱节; - 数量合规:每层每个方向生成
layer个六边形,总数量严格为6*layer,符合6的倍数要求; - 中心层补全:单独生成第0层的中心六边形,匹配螺旋环的起始结构。
使用注意事项
- 确保六边形预制体为正六边形(宽高比为
2:√3,约1:0.866),否则需调整预制体原始尺寸; HexSideLength直接控制六边形实际边长,无需额外计算缩放倍数,调试更便捷。
内容的提问来源于stack exchange,提问作者hansueyuu
相关产品推荐
相关产品推荐

