当用户点击一个按钮时,如果点击一个透明像素,我希望点击被忽略,而它下面的按钮应该接收点击。
我可以在几分钟内在objective 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光线投射忽略精灵的alpha
我找到了这个链接http://forum.unity3d.com/threads/alpha-area-on-round-gui-button-return-click-event.13608/其中有人试图确定鼠标位置是否在图像边界内。一个明显的问题是,图像必须在(100,100)处有某个角。神奇的数字是不好的,试图找出如何得到这些坐标几乎是不可能的。
无论您将按钮放置在何处,RectTransform的以下属性总是相同的:
anchoredPosition
anchoredPosition3D
anchorMax
anchorMin
offsetMax
offsetMin
pivot
rect
sizeDelta
如你所见,就是RectTransform拥有的所有属性。因此,不可能知道按钮在哪里,也不可能知道点击在按钮的坐标空间中的位置。
谁能告诉我怎么做我需要做什么?应该可以做到:
bool isScreenPointInsideRectTransform( Vector2 screenPoint, RectTransform transform, Camera canvasCamera )
{
Vector2 localPoint;
RectTranformUtility.ScreenPointToLocalPointInRectangle( transform, screenPoint, canvasCamera, out localPoint );
return transform.rect.Contains( localPoint );
}
这就是为什么你找不到按钮内部点的位置…但是你比较在按钮的父 rect和按钮的localPosition本身的点的位置。
或者你可以将像素点转换为屏幕位置然后与鼠标位置进行比较