当用户点击按钮时,如果点击透明像素并且其下方的按钮应该接收到点击,我希望忽略点击。
我可以在几分钟内在目标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具有的所有属性。因此,无法确定按钮的位置,也无法确定按钮坐标空间中的单击位置。
有人可以告诉我如何做我需要做的事吗?
答案 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本身。
那可以将像素点转换为屏幕位置,然后与鼠标位置进行比较