Unity的Layout提供了几种自适应方式。
一个是通过LayoutGroup来确保子物体的自适应方式。一种是给物体直接加上content size fitter。
但是如果不注意,非常容易造成冲突,导致自适应没办法达成效果
比如上图这种nest,Overlap和Layout Group都有一个Vertical Layout Group的组件,Text123则都有一个content size fitter组件。但是如果Text2文本过长,从脚本控制Text2显示的时候,就会和Text3和Text1有Overlap的现象。
基本上这种设置的情况下会Unity会出现警告。
其实这种时候只要把ContentSizeFitter去掉,用父节点的LayoutGroup来控制自适应就可以解决问题。
但是网上很多workaround是用了另外一种方法,用MarkLayoutForRebuild把所有的layout都mark然后让Unity再次build。
但是这种方法有一个问题就是如果这一个周期里面UI已经被SetDirty了,那即使再MarkLayoutForRebuild也会被无视掉。所以很多人就选择了等一帧,下一帧的开始直接mark,然后再rebuild。
yield return new WaitForEndOfFrame();
LayoutRebuilder.MarkLayoutForRebuild(rect);
这就完全没有必要搞的这么复杂,一个是要重构layout必须取得所有父节点的Rect然后还要再渲染一遍,费力又费时。就直接把prefab重新整理一下是最好的选择了。
文章评论