当用户点击一个按钮时,如果要击中一个透明像素,则我希望忽略该点击,而在它下面的按钮应该接收点击。
我可以在几分钟内在目标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的所有属性。因此,不可能知道按钮在哪里,也无法知道单击在按钮的坐标空间中。
有人可以告诉我该怎么做吗?
最佳答案
这就是为什么您找不到按钮本身内部的点的位置的原因...但是您将按钮的父矩形内部的点的位置与按钮localPosition本身进行了比较。
那或者您可以将像素点转换为屏幕位置,然后与鼠标位置进行比较