代码之家  ›  专栏  ›  技术社区  ›  twobob

获取一个UnityEngine.ui.images在屏幕空间中的位置,并计算一个标准化偏移量(在覆盖画布中)

  •  16
  • twobob  · 技术社区  · 8 年前

    手边的问题:

    简化

    给定unityEngine.ui.image,如何找到x,y位置 内部的标准化偏移量(如左上角的0.4、0.3) 以屏幕空间为单位的图像,如400300

    我想我需要找到左上角的屏幕空间值 然后知道图像的渲染总大小,根据以像素表示的实际大小比缩放归一化偏移。

    图1:

    图2显示了将要使用的NormalisedOffset

    图2:

    所以,在precis中,我需要找到屏幕空间像素的偏移量 我根据图像存储的矩形的左上角。

    我认识到它可能是camera.main.viewporttoworldpoint()和一些对边界的引用的组合, 可能是通过背景图片sprite.pixelsperUnit来缩放?

    努力想象如何准确完成这项工作。

    谢谢

    我想我需要找到左上角的屏幕空间值 然后知道渲染后的图像总大小,根据像素表示的实际大小比缩放归一化偏移。

    图1: Figure 1:

    图2显示了将要使用的NormalisedOffset

    图2: An example stored Rect "offset"

    所以,在precis中,我需要找到屏幕空间像素的偏移量 我根据图像存储的矩形的左上角。

    我认识到它可能是camera.main.viewporttoworldpoint()和一些对边界的引用的组合, 可能是通过背景图片sprite.pixelsperUnit来缩放?

    努力想象如何准确地完成这项工作。

    谢谢

    1 回复  |  直到 8 年前
        1
  •  -1
  •   CJ Dennis    8 年前

    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;
    

    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);
    
    推荐文章