记录判断鼠标点击是否在某个窗口内的方案。
碰到一个需求,界面有两层,后面层的模型由3Dcamera照着,前面层的窗口由2DCamera显示,但是当窗口区域遮挡住3D区域的时候,3D区域依然可以响应鼠标操作(可以在重叠区域拖动后面模型)。希望当3D区域前面有2D窗口遮挡的时候,让鼠标点击拖动只响应到2D窗口。
方案是判断鼠标在2D窗口内拖动时,让3D模型的拖动、旋转等鼠标操作失效。
RectTransform.RectangleContainsScreenPoint 方法顾名思义,判断矩阵范围是否包含屏幕点,参数:位置矩阵、屏幕点、使用的Camera 三个。
if(RectTransformUtility.RectangleContainsScreenPoint(transform.GetComponent(),
Input.mousePosition, Cameras.UI))
{
Debug.Log("在遮挡范围内");
}
方法很简单,主要是要知道这个API,下面把 RectTransformUtility 其他API翻译整理下。
官方描述:https://docs.unity3d.com/2018.3/Documentation/ScriptReference/RectTransformUtility.html
提供了7个方法,分别列出来
① void FlipLayoutAxes(RectTransform rect, bool keepPositioning, bool recursive);
摘要:翻转 RectTransform 的水平、垂直轴,包括大小和对齐方式的翻转。
参数:
rect - 要翻转的 RectTransform;
keepPositioning - 是否保持自身位置,如果 true,则围绕轴翻转,如果为false,则在父 RectTransform 内翻转;
recursive - 子元素是否一起翻转。
② void FlipLayoutOnAxis(RectTransform rect, int axis, bool keepPositioning, bool recursive);
摘要:沿着水平或垂直方向翻转 RectTransform 的对齐方式。比如从左到右的控件水平翻转后,从右到左
参数:
axis - 要沿着翻转的轴。0是水平,1是垂直
③ Vector2 PixelAdjustPoint(Vector2 point, Transform elementTransform, Canvas canvas);
摘要:将屏幕给定点转换为像素正确点。
返回结果:像素转换后的点。
④ Rect PixelAdjustRect(RectTransform rectTransform, Canvas canvas);
摘要:给定 RectTransform,以像素精确坐标返回角点。
返回结果:像素调整后的 矩阵变换。
⑤ bool RectangleContainsScreenPoint(RectTransform rect, Vector2 screenPoint, Camera cam);
摘要:RectTransform 是否包含从给定相机看到的屏幕点。
返回结果:如果点在矩阵范围内,返回 True,否则返回 False。
⑥ bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint);
摘要:将屏幕空间点转换为 RectTransfrom 本地空间的位置。
参数:
rect - 要在里面找一个点的 RectTransfom。
cam - 屏幕空间点关联的 Camera。
screenPoint - 屏幕空间点
localPoint - 本地空间的点
⑦ bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector3 worldPoint);
摘要:将屏幕空间点转换为 RectTransform 世界空间中的位置。