| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | using UnityEngine;using System.Collections.Generic;namespace Fort23.Core{public enum LayoutType{    Horizontal,    Vertical}public class SimpleLayout{    /// <summary>    /// 根据传入的布局类型,排列 GameObject 列表,水平排列并居中    /// </summary>    /// <param name="list">需要排列的 GameObject 列表</param>    /// <param name="type">布局类型,支持 Horizontal 或 Vertical</param>    /// <param name="spacing">元素之间的间距</param>    public static void Layout(List<object> list, LayoutType type, float spacing = 0f)    {        // 获取父节点的 RectTransform        if (list.Count == 0)            return;        if (type == LayoutType.Horizontal)        {            List<GameObject> activeElements = new List<GameObject>();            // 筛选 active 为 true 的元素            foreach (object item in list)            {                GameObject g = item as GameObject;                if (g != null && g.activeSelf)                {                    activeElements.Add(g);                }            }            int count = activeElements.Count;            // 如果没有 active 的元素,直接返回            if (count == 0) return;            // 计算起始位置,使中心点的元素对齐父节点中心            float totalWidth = 0f;            for (int i = 0; i < count; i++)            {                RectTransform rt = activeElements[i].GetComponent<RectTransform>();                totalWidth += rt.rect.width + (i < count - 1 ? spacing : 0);            }            // 起始位置的计算:最左侧元素的中心点相对于父节点            float startX = -totalWidth / 2 + activeElements[0].GetComponent<RectTransform>().rect.width / 2;            // 设置每个元素的位置            for (int i = 0; i < count; i++)            {                RectTransform rt = activeElements[i].GetComponent<RectTransform>();                // 更新位置                rt.anchoredPosition = new Vector2(startX, 0);                // 移动到下一个元素位置                startX += rt.rect.width + spacing;            }        }        else if (type == LayoutType.Vertical)        {            List<GameObject> activeElements = new List<GameObject>();            // 筛选 active 为 true 的元素            foreach (object item in list)            {                GameObject g = item as GameObject;                if (g != null && g.activeSelf)                {                    activeElements.Add(g);                }            }            int count = activeElements.Count;            // 如果没有 active 的元素,直接返回            if (count == 0) return;            // 计算起始位置,使中心点的元素对齐父节点中心            float totalHeight = 0f;            for (int i = 0; i < count; i++)            {                RectTransform rt = activeElements[i].GetComponent<RectTransform>();                totalHeight += rt.rect.height + (i < count - 1 ? spacing : 0);            }            // 起始位置的计算:最顶部元素的中心点相对于父节点            float startY = totalHeight / 2 - activeElements[0].GetComponent<RectTransform>().rect.height / 2;            // 设置每个元素的位置            for (int i = 0; i < count; i++)            {                RectTransform rt = activeElements[i].GetComponent<RectTransform>();                // 更新位置                rt.anchoredPosition = new Vector2(0, startY);                // 移动到下一个元素位置                startY -= rt.rect.height + spacing;            }        }    }}}
 |