您当前的位置: 首页 >  ui

染指流年灬

暂无认证

  • 3浏览

    0关注

    194博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

UGUI之代码中心对齐的bug

染指流年灬 发布时间:2021-12-29 21:22:25 ,浏览量:3

在Unity2021.1.12f1c1中 有这样一段代码

在Canvas是ScreenSpace-Camera模式下

 public static void SetPreferredWH(Image imgToSet, RectTransform preferHeightImg)
     {
          ..


          imgToSet.transform.position = preferHeightImg.transform.position;
		..

     }

这段代码主要是让一张图片的中心能和另一张图片对齐 这是正常运行的

然后发现在任何一张图片的pivot不是(0.5,0.5)时 都是对不齐的,因为这句代码只是控制了两个pivot对齐

然后改成了如下

imgToSet.transform.position = new Vector3(
               preferHeightImg.transform.position.x + 
               (0.5f  - preferHeightImg.pivot.x ) * preferHeightImg.rect.width,
               preferHeightImg.transform.position.y + 
               (0.5f  - preferHeightImg.pivot.y ) * preferHeightImg.rect.height,
               imgToSet.transform.position.z
               );

貌似是对了,但是这样走之后,inspector面板里面的imgToSet的position栏的值是非常大或非常小的,绝对值达到了五位数的级别 我在函数入口处和这个地方做了打印, 在这里插入图片描述

然后结果是 在这里插入图片描述 当时是比较震惊的,其实这个特点我已经记录过了 在这里 UGUI进阶知识[四]关于UI定位和适配 的position部分有写到,所以在这种情况下,应该这样写 因为rect里面的宽高都属于UI单位的,所以在localposition的时候可以直接进行计算 但是在position的时候就不行,因为世界中的单位比UI单位要大很多

在这里插入图片描述

另外下面的代码中的preferHeightImg.transform.InverseTransformPoint只适合用于将UI组件的position转换,因为这时他的position代表了世界坐标,不适用于IPointerDownHandler的OnPointerDown(PointerEventData eventData)里面的eventData.position,因为这时他表示的是屏幕坐标,需要调用uiCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, 100));转换为世界坐标,其中100表示的是这个ScreenSpace-Camera的Canvas的PlaneDistance 在这里插入图片描述

imgToSet.transform.position = preferHeightImg.transform.position;
          
          Vector3 toSetImgLocalPos = 
               preferHeightImg.transform.InverseTransformPoint(imgToSet.transform.position);
          
          toSetImgLocalPos.x += preferHeightImg.transform.position.x 
                                + (0.5f - preferHeightImg.pivot.x) * preferHeightImg.rect.width;
          
          Vector3 toSetImgWorldPosNew = preferHeightImg.transform.TransformPoint(toSetImgLocalPos);
          
          imgToSet.transform.position = toSetImgWorldPosNew;
关注
打赏
1665909078
查看更多评论
立即登录/注册

微信扫码登录

0.0464s