UGUI之代码中心对齐的bug

在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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

染指流年丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值