You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单位排列为六边形布局?附现有螺旋布局实现代码

六边形布局实现方案

要实现你需要的六边形单位排列,可以通过轴向坐标转笛卡尔坐标的方式,将单位按六边形的层(环)来分布,替代原有的螺旋布局逻辑。以下是完整的实现代码及说明:

核心代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:34