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

Unity UI如何按指定列优先顺序显示列表项?

实现列优先的UI元素排列位置计算

现有Unity代码用于生成物品展示,当前是行优先排列(左到右填满列后换行),但需要改为列优先排列,即元素按如下顺序布局:

1   4   7
2   5   8
3   6   9

当前代码如下:

public void CreateDisplay()
{
    for (int i = 0; i < inventory.Container.Count; i++)
    {
        var obj = Instantiate(inventory.Container[i].item.DefaultPrefab, Vector3.zero, Quaternion.identity, transform);
        obj.GetComponent<RectTransform>().localPosition = GetPosition(i);
        obj.GetComponentInChildren<TextMeshProUGUI>().text = inventory.Container[i].level.ToString();
    }
}

public Vector3 GetPosition(int i)
{
    return new Vector3(X_START + (X_SPACE_BETWEEN_ITEM * (i % NUMBER_OF_COLUMN)), Y_START + (-Y_SPACE_BETWEEN_ITEM * (i / NUMBER_OF_COLUMN)), 0f);
}

解决方案

要实现列优先排列,需重新计算每个索引i对应的列、行索引,修改GetPosition方法即可:

public Vector3 GetPosition(int i)
{
    int totalItems = inventory.Container.Count;
    // 计算总行数,向上取整确保容纳所有元素
    int totalRows = Mathf.CeilToInt((float)totalItems / NUMBER_OF_COLUMN);
    
    // 列优先的索引转换:列索引 = 元素索引 / 总行数;行索引 = 元素索引 % 总行数
    int columnIndex = i / totalRows;
    int rowIndex = i % totalRows;
    
    return new Vector3(
        X_START + X_SPACE_BETWEEN_ITEM * columnIndex,
        Y_START - Y_SPACE_BETWEEN_ITEM * rowIndex,
        0f
    );
}

原理说明

以9个元素、3列为例:

  • totalRows = 3,每个列恰好有3个元素
  • 索引0(对应元素1):列索引0/3=0,行索引0%3=0 → 第一列第一行
  • 索引3(对应元素4):列索引3/3=1,行索引3%3=0 → 第二列第一行
  • 索引1(对应元素2):列索引1/3=0,行索引1%3=1 → 第一列第二行
    以此类推,完全匹配目标布局。

若元素数量无法被列数整除(比如8个元素、3列),totalRows仍为3,最后一列仅显示2个元素,布局为:

1   4   7
2   5   8
3   6

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:20:32