我猜您在图像父母中没有任何缩放或旋转,并且位置 Y 为 0。
首先,您可以通过以下方式获取图像左上角的位置rectTransform.GetWorldCorners()
:
//Upper left corner
Vector3[] v = new Vector3[4];
image.rectTransform.GetWorldCorners(v);
var recPos = v[1];
然后,您必须通过图像大小和矩形大小之间的比率将标准化偏移量转换为世界空间偏移量,并添加左上角的位置:
var recWidth = image.rectTransform.sizeDelta.x;
var imgWidth = image.sprite.texture.width;
var realOffsetX = offsetX * (recWidth / imgWidth);
var realPosX = recPos.x + realOffsetX;
(这与 Y 坐标的公式相同,但您必须减去您的比率realOffsetY
,因为偏移量是从左上角计算的)
这是完整的方法:
private Vector3 GetPositionOffset(Image image, float offsetX, float offsetY)
{
//Upper left corner
Vector3[] v = new Vector3[4];
image.rectTransform.GetWorldCorners(v);
var recPos = v[1];
//X coordinate
var recWidth = image.rectTransform.sizeDelta.x;
var imgWidth = image.sprite.texture.width;
var realOffsetX = offsetX * (recWidth / imgWidth);
var realPosX = recPos.x + realOffsetX;
//Y coordinate
var recHeight = image.rectTransform.sizeDelta.y;
var imgHeight = image.sprite.texture.height;
var realOffsetY = offsetY * (recWidth / imgWidth);
var realPosY = recPos.y - realOffsetY;
//Position
return new Vector3(realPosX, realPosY, image.transform.position.z);
}
然后,如果您希望这个世界空间到屏幕空间,只需使用相机方法:
camera.WorldToScreenPoint(positionOffset);