记一次Unity_UGUI入门

Posted avi9111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次Unity_UGUI入门相关的知识,希望对你有一定的参考价值。

好吧,写了那么多年Unity,

发现自己还是什么都不会

参考:

自动生成代码(前)

Unity UI代码自动生成 - 盘子脸 - 博客园 (cnblogs.com)

UI动画

Unity进阶技巧 - 动态创建UGUI - 简书 (jianshu.com)

UI边界Bounds

假如有1个UI

下面有2个UIImage

是可以计算子节点的区域大小的

只要在第一个UI节点添加脚本,

[ExecuteInEditMode]
public class BoundsManager : MonoBehaviour
{
    GameObject _tempObject;
    private Canvas _canvas;
    void OnEnable()
    {
        if(_tempObject==null)
        {
           _tempObject = new GameObject("TEMP");
           _tempObject.AddComponent<Image>();
        }
        var rect = transform.GetComponent<RectTransform>();
        _canvas = rect.GetComponentInParent<Canvas>();
        _tempObject.transform.SetParent(_canvas.transform,false);
        
//uNITY 提供的关键方法
        var bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(_canvas.GetComponent<RectTransform>(), rect);


        var targetRect = _tempObject.GetComponent<RectTransform>();
        SetAnchorMiddleCenter(targetRect);
        //targetRect.anchorMin = new Vector2(bounds.min.x,bounds.min.y);
        //targetRect.anchorMax = new Vector2(bounds.max.x, bounds.max.y);
        targetRect.sizeDelta = bounds.size;
        targetRect.anchoredPosition = bounds.center;
    }
    
    public static void SetAnchorMiddleCenter(RectTransform rectTransform){
    

        rectTransform.offsetMin = new Vector2(0.5f, 0.5f);//好像是不对的,哈哈哈
        rectTransform.offsetMax = new Vector2(0.5f, 0.5f);
        rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
        rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
    }


    
}

计算锚点中心

        public static Vector2 ToCenterPivot(RectTransform rect,Vector2 srcPos)
        {
            //设:p1==原点;p2==最终我们要的目标点
            //公式:p1+p=p2
            var pWidth = (rect.sizeDelta.x ) * (rect.pivot.x-0.5f);
            var pHeight = (rect.sizeDelta.y ) * (rect.pivot.y-0.5f);
            
            Vector2 nodeOffset = Vector2.zero;
            if (rect.parent != null)
            {
//                //anchor和父节点有关
                var parentSize = rect.parent.GetComponent<RectTransform>().sizeDelta;
                var x = (0.5f-(rect.anchorMin.x+(rect.anchorMax.x - rect.anchorMin.x) / 2)) * parentSize.x;
                var y = (0.5f-(rect.anchorMin.y+(rect.anchorMax.y - rect.anchorMin.y) / 2)) * parentSize.y;
                
                nodeOffset =new Vector2(x,y);
            }

            return srcPos + new Vector2(pWidth, pHeight) + nodeOffset;
        }

以上是关于记一次Unity_UGUI入门的主要内容,如果未能解决你的问题,请参考以下文章

记一次BurstJob入门

记一次渲染引擎入门

记一次行为树入门——AI应该如何配置

记一次3dmax操作入门

记一次CommandBuffer入门

记一次UnityProfiler入门—重点说说UI,UIDetail