关于UGUI的DropDown点击区域外不关闭的问题

  • Post author:
  • Post category:其他


最近在项目开发过程中,出现了一个问题,同样的配置,在背包中的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 版权协议,转载请附上原文出处链接和本声明。