在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;