UGUI的Mesh重建

UGUI的Mesh重建
Canvas.SendWillRenderCanvas 发送渲染命令,网格进行了重建, 那么用户的哪些行为会导致UGUI的重建呢 ?

using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
 //通过反射的方式,找到哪些因素导致了网格重建
 //代码来自雨凇MMO的博客
public class NewBehaviourScript : MonoBehaviour {
    IList<ICanvasElement> m_LayoutRebuildQueue;   //布局重建队列
    IList<ICanvasElement> m_GraphicRebuildQueue;  //图片重建队列
    private void Awake()
    {
        System.Type type = typeof(CanvasUpdateRegistry);
        FieldInfo field = type.GetField("m_LayoutRebuildQueue", BindingFlags.NonPublic | BindingFlags.Instance);
        m_LayoutRebuildQueue = (IList<ICanvasElement>)field.GetValue(CanvasUpdateRegistry.instance);
        field = type.GetField("m_GraphicRebuildQueue", BindingFlags.NonPublic | BindingFlags.Instance);
        m_GraphicRebuildQueue = (IList<ICanvasElement>)field.GetValue(CanvasUpdateRegistry.instance);
    }
 
    private void Update()
    {
        for (int j = 0; j < m_LayoutRebuildQueue.Count; j++)
        {
            var rebuild = m_LayoutRebuildQueue[j];
            if (ObjectValidForUpdate(rebuild))
            {
                Debug.LogFormat("{0}引起{1}网格重建", rebuild.transform.name, rebuild.transform.GetComponent<Graphic>().canvas.name);
            }
        }
 
        for (int j = 0; j < m_GraphicRebuildQueue.Count; j++)
        {
            var element = m_GraphicRebuildQueue[j];
            if (ObjectValidForUpdate(element))
            {
                Debug.LogFormat("{0}引起{1}网格重建", element.transform.name, element.transform.GetComponent<Graphic>().canvas.name);
            }
        }
    }
    private bool ObjectValidForUpdate(ICanvasElement element)
    {
        var valid = element != null;
 
        var isUnityObject = element is Object;
        if (isUnityObject)
            valid = (element as Object) != null; //Here we make use of the overloaded UnityEngine.Object == null, that checks if the native object is alive.
 
        return valid;
    }
}

总结:
Text组件: 内容和颜色变化,支持富文本,行模式,改变字体的大小,改变文本的对齐方式,改变水平或垂直溢出,修改行间距,改变字体样式

Image组件: 颜色改变,类型改变,FillCenter改变, Image.preserveAspect改变,填充方式改变,fillAmount改变,Image.fillClockWise改变, Image.FillOrigin改变

RawImage组件: Texture改变, UVRect改变

Mask组件: 设置是否展示与Mask渲染区域相关的图形(showMaskGraphic)

enable发生变化

所有继承MaskableGraphic的控件 (Image、RawImage、RectMask2D、Text) 设置此图形是否允许被遮盖、enable发生变化、父节点发生变化(TransFromParentChanged)、在Hierachy面板上发生改变(HierachyChanged)。
所有继承自BaseMeshEffect的效果类(目前只看到Shadow及PositionAsUV1)的enable变化及应用动画属性的操作。
所有继承自Graphic的UI控件材质(material)发生变化。

UI优化
小地图优化
Mask Rect2DMesk softMask
优化 Dotween动画

参考文章

https://www.xuanyusong.com/archives/4573
https://zhuanlan.zhihu.com/p/46208753
https://zhuanlan.zhihu.com/p/47362863
https://blog.csdn.net/ecidevilin/article/details/52555253
https://blog.csdn.net/weixin_30390075/article/details/95191455
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值