最近在项目开发过程中,出现了一个问题,同样的配置,在背包中的DropDown点击展开后,点击非DropDown区域外可以自动关闭,但是好友的确关闭不了,查看UGUI的DropDown源码后发现UGUI的大坑,看源码:
GameObject CreateBlocker(Canvas rootCanvas)
{
// Create blocker GameObject.
GameObject blocker = new GameObject("Blocker");
// Setup blocker RectTransform to cover entire root canvas area.
RectTransform blockerRect = blocker.AddComponent<RectTransform>();
blockerRect.SetParent(rootCanvas.transform, false);
blockerRect.anchorMin = Vector3.zero;
blockerRect.anchorMax = Vector3.one;
blockerRect.sizeDelta = Vector2.zero;
// Make blocker be in separate canvas in same layer as dropdown and in layer just below it.
Canvas blockerCanvas = blocker.AddComponent<Canvas>();
blockerCanvas.overrideSorting = true;
Canvas dropdownCanvas = m_Dropdown.GetComponent<Canvas>();
blockerCanvas.sortingLayerID = dropdownCanvas.sortingLayerID;
blockerCanvas.sortingOrder = dropdownCanvas.sortingOrder - 1;
// Add raycaster since it's needed to block.
blocker.AddComponent<GraphicRaycaster>();
// Add image since it's needed to block, but make it clear.
Image blockerImage = blocker.AddComponent<Image>();
blockerImage.color = Color.clear;
// Add button since it's needed to block, and to close the dropdown when blocking area is clicked.
Button blockerButton = blocker.AddComponent<Button>();
blockerButton.onClick.AddListener(Hide);
return blocker;
}
看以看出点击区域外关闭主要是通过创建了一个大的透明按钮,点击这个按钮就会调用自己的Hide函数关闭,并且自适应是根据Canvas自适应的,那么这个Canvas是怎么来的呢,再看代码:
list = ListPool<Canvas>.Get();
gameObject.GetComponentsInParent(false, list);
if (list.Count == 0)
return;
Canvas rootCanvas = list[0];
ListPool<Canvas>.Release(list);
坑的地方来了,它是取父的Canvas中最近的那个Canvas来做参照的,在我们的游戏项目总中,这个Canvas的大小是0,0,所以你怎么点都点不到
我们的解决方案是重新设置这个blocker的父到响应的面板下,这个这个bloker的大小会自动适应全屏,当然解决方案有很多,找一个最适合自己项目
版权声明:本文为Rhett_Yuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。