一.UGUI锚点的知识总结(模式是在Screen Space-overlay下),这里以一个panel为例
(1)panel的锚点的四个点在canvas的位置的坐标位置的百分比总是固定,即其尺寸和实际坐标值都会按照canvas的缩放而缩放。
(2)当canvas发生缩放时, panel的四条边分别与对应的锚点的四条边的距离是固定的,不会随着canvas和锚点的缩放而缩放,而是按照到锚点的固定距离进行缩放。
(3)设置panel的大小和坐标随着canvas的缩放而缩放:首先设置panel的四个锚点在canvas的用户想要panel的四个顶点所在的合适的位置,然后调节panel的四条边和锚点的四条边重合,所以当canvas缩放时,锚点也会跟着缩放,由于panel的四边与锚点的四边的距离固定为0,所以panel也会跟着缩放。如果直接调节panel的缩放,那么缩放是以中心点为中心进行缩放。
另外利用矩形工具和缩放工具不同,缩放工具包括是子物体在内的所有元素整体缩放;而矩形工具用于缩放时只对目标物体缩放,并不会对其子物体产生作用,包括文字也不会产生直接作用。用缩放工具缩放之后再用矩形工具缩放两者并不会冲突,因为,矩形工具缩放过程中会有虚线边框,这个边框就是矩形缩放工具的正确缩放边框,当缩放工具缩放为1时,UI就会刚好和缩放边框重合。
(4)自定义父子元素均可边框缩放的网格布局:1.设置网格容器的宽和高方向的网格数量添加相应的空物体数量,并设置其锚点位置,锚点根据空格宽度和网格宽和高的数量自动计算设置,添加一个项目到网格容器里时首先查看是否有没有子物体的空物体,然后让要添加的项目物体成为该物体的子物体,并且设置其锚点为四个锚点的位置100%,设置四边的离锚点距离为0。(Unity的自带网格布局容器有更简单的方法吗?)
二.其他UI的使用与问题
1.Image和RawImage的区别:RawImage可以使用任何贴图,而Image只能使用精灵;Image相当于对RawImage的再次封装和扩展,RawImage可以设置UV。
2.TextMeshPro:更好的Text操作,可以设置更多的样式。
三.UI与相机,屏幕坐标与世界坐标,transform与RectTransform的关系
这里以物体跟随鼠标为例
如果canvas的模式是全屏模式,那么屏幕上的ui的坐标就是屏幕的坐标,Getcomponent<RectTransform>().position=new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
如果canvas是相机模式,或者世界物体模式,那么屏幕的坐标就要根据渲染UI的相机关系转换为世界坐标,transfom.position=uiCamera.ScreenToWorldPoint(Input.mousePosition);
将一个物体的位置转换为屏幕上的坐标,再将屏幕上的坐标转换为某个ui平面上的坐标(例如用来做非空间模式下UI作为敌人头上的血条):
var t = Vector2.zero;//获取的坐标位置
RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, iPos, cam, out t);//rect目标ui平面,ipos目标物体在屏幕上的位置,cam目标相机,t获取的位置
icon.GetComponent<RectTransform>().anchoredPosition = t;
四.unity自适应子物体大小大小
如果如果子物体的数量变多,或者子物体的大小变大,为了保持子物体被父物体包含,或者保持父物体自动伸缩,可以手动计算大小,但是最好的使用方式的应用组件contentsizi-filter。
如果父物体有contentsize-filter组件,而子物体也有contentsizefilter组件,但是在一些情况下会发生子物体的contentsizefilter没有生效或者其他布局组件失效的情况,这时可以使LayoutRebuilder.ForceRebuildLayoutImmediate(rect);来强制刷新。先刷新子物体,再逐级刷新父物体。