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

最近在项目开发过程中,出现了一个问题,同样的配置,在背包中的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的大小会自动适应全屏,当然解决方案有很多,找一个最适合自己项目

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值