yyl
2026-05-11 51b0f6ed9f4e1d3bb6f8144470b46908c7699a96
Main/Utility/UIUtility.cs
@@ -3,15 +3,29 @@
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using vnxbqy.UI;
using Cysharp.Threading.Tasks;
public static class UIUtility
{
    public static GameObject CreateWidget(string _sourceName, string _name)
    public static async UniTask<GameObject> CreateWidget(string _sourceName, string _name)
    {
        var prefab = ResManager.Instance.LoadAsset<GameObject>("UIComp", _sourceName);
        var prefab = await UILoader.LoadPrefabAsync(_sourceName);
        if (prefab == null)
        {
            return null;
        }
        var instance = GameObject.Instantiate(prefab);
        instance.name = string.IsNullOrEmpty(_name) ? _sourceName : _name;
        return instance;
    }
    public static async UniTask<GameObject> CreateWidgetAsync(string _sourceName, string _name)
    {
        var prefab = await UILoader.LoadPrefabAsync(_sourceName);
        if (prefab == null)
        {
            return null;
@@ -78,22 +92,16 @@
    public static Vector2 GetMaxWorldPosition(this RectTransform _rectTransform)
    {
        Vector2 max;
        var offsetY = (1 - _rectTransform.pivot.y) * _rectTransform.rect.height;
        var offsetX = (1 - _rectTransform.pivot.x) * _rectTransform.rect.width;
        max = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        return max;
        Vector3[] cornors = new Vector3[4];
        _rectTransform.GetWorldCorners(cornors);
        return cornors[2];
    }
    public static Vector2 GetMinWorldPosition(this RectTransform _rectTransform)
    {
        Vector2 min;
        var offsetY = -_rectTransform.pivot.y * _rectTransform.rect.height;
        var offsetX = -_rectTransform.pivot.x * _rectTransform.rect.width;
        min = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        return min;
        Vector3[] cornors = new Vector3[4];
        _rectTransform.GetWorldCorners(cornors);
        return cornors[0];
    }
    public static Vector2 GetMaxReferencePosition(this RectTransform _rectTransform, Transform _reference)
@@ -316,24 +324,6 @@
        vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
    }
    // public static string GetUIElementRelativePath(UIRoot _root, Transform _transform)
    // {
    //     List<Transform> parents = new List<Transform>() { _transform };
    //     GetParents(_transform, ref parents);
    //     if (parents.Contains(_root.transform))
    //     {
    //         parents.Remove(_root.transform);
    //     }
    //     var names = new string[parents.Count];
    //     for (int i = 0; i < names.Length; i++)
    //     {
    //         names[i] = parents[i].gameObject.name;
    //     }
    //     return string.Join("/", names);
    // }
    public static void GetParents(Transform _transform, ref List<Transform> _parents)
    {
@@ -350,4 +340,44 @@
        }
    }
    public static string GetUIElementRelativePath(Transform _root, Transform _transform)
    {
        List<Transform> parents = new List<Transform>() { _transform };
        GetParents(_transform, ref parents);
        if (parents.Contains(_root))
        {
            parents.Remove(_root);
        }
        var names = new string[parents.Count];
        for (int i = 0; i < names.Length; i++)
        {
            names[i] = parents[i].gameObject.name;
        }
        return string.Join("/", names);
    }
        /// <summary>
    /// 强制刷新Layout,解决嵌套Layout和ContentSizeFitter的重叠问题
    /// </summary>
    public static async UniTask ForceRefreshLayout(Transform _layout)
    {
        await UniTask.DelayFrame(2);
        // 刷新所有Layout组件
        var layouts = _layout.GetComponentsInChildren<LayoutGroup>(true);
        foreach (var layout in layouts)
        {
            LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
        }
        await UniTask.DelayFrame(2);
        // 刷新所有Layout组件
        foreach (var layout in layouts)
        {
            LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
        }
    }
}