如何将点转换为本地坐标?

How do I convert point to local coordinates?

当用户点击一个按钮时,如果点击了透明像素,我希望忽略点击,而应该接收点击它下方的按钮。

我可以在几分钟内在 objective c 中完成这种行为,但是,尝试在 C# 中的 Unity 中执行此操作已被证明是不可能的,因为无法将点从屏幕转换为本地点。显然中心或左下角,或左上角应该是原点(我不知道哪个因为 Unity 根据月相不断改变原点的位置)

我尝试查看 ICanvasRaycastFilter 中的 IsRaycastLocationValid 在里面,我同时使用了 RectTransformUtility.ScreenPointToLocalPointInRectangle 和 RectTransformUtility.ScreenPointToWorldPointInRectangle,结果总是一样的。我给的RectTransform是属于button的那个

例如:

public bool IsRaycastLocationValid(Vector2 screenPosition, Camera raycastEventCamera) //uGUI callback
    {

        Vector2 localPoint;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPosition, null, out localPoint);

        Vector2 pivot = rectTransform.pivot - new Vector2(0.5f, 0.5f);

        Vector2 pivotScaled = Vector2.Scale(rectTransform.rect.size, pivot);

        Vector2 realPoint = localPoint + pivotScaled;

        Debug.Log(screenPosition + " " + localPoint);

        return false;
    }

这是我从其他人未回答的尝试中得到的 Unity 3d 4.6 Raycast ignore alpha on sprite

我找到了这个 link http://forum.unity3d.com/threads/alpha-area-on-round-gui-button-return-click-event.13608/ 有人试图确定 mousePosition 是否在图像边界内。明显的问题是图像必须在 (100,100) 处有一些角。魔术数字很糟糕,想弄清楚如何获得这些坐标几乎是不可能的。

无论您将按钮放在何处,RectTransform 的以下属性始终相同:

anchoredPosition    
anchoredPosition3D  
anchorMax   
anchorMin   
offsetMax   
offsetMin   
pivot   
rect    
sizeDelta

如您所见,这就是 RectTransform 的所有属性。因此无法分辨按钮的位置,也无法分辨按钮坐标 space.

中的点击位置。

有人可以告诉我如何做我需要做的事吗?

这就是为什么您找不到按钮本身内部点的位置...但是您 比较 内部点的位置parent 按钮的 rect 和按钮的 localPosition 本身。

或者您可以将像素点转换为屏幕位置,然后与鼠标位置进行比较

应该这样做:

bool isScreenPointInsideRectTransform( Vector2 screenPoint, RectTransform transform, Camera canvasCamera )
{
    Vector2 localPoint;
    RectTranformUtility.ScreenPointToLocalPointInRectangle( transform, screenPoint, canvasCamera, out localPoint );
    return transform.rect.Contains( localPoint );
}