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

时间:2015-06-10 01:59:28

标签: c# user-interface button unity3d

当用户点击按钮时,如果点击透明像素并且其下方的按钮应该接收到点击,我希望忽略点击。

我可以在几分钟内在目标c中执行此类行为,但是,尝试在C#中使用Unity执行此操作已证明是不可能的,因为无法将点从屏幕转换为本地点。显然,中心或左下角或左上角应该是原点(我不知道哪个因为Unity在原点取决于月相的位置不断变化)

我试过从ICanvasRaycastFilter查看IsRaycastLocationValid 在内部我使用了RectTransformUtility.ScreenPointToLocalPointInRectangle和RectTransformUtility.ScreenPointToWorldPointInRectangle,结果总是一样的。我给出的RectTransform是属于按钮的那个。

例如:

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

我找到了这个链接 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具有的所有属性。因此,无法确定按钮的位置,也无法确定按钮坐标空间中的单击位置。

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

2 个答案:

答案 0 :(得分:2)

应该做的诀窍:

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

答案 1 :(得分:1)

这就是为什么你没有找到按钮本身内部点的位置...但你比较 矩形内的点的位置按钮和按钮localPosition本身。

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