UGUI中的CanvasGroup组件Interactable在某些控件上无效的问题

本文介绍了在Unity UGUI中使用CanvasGroup组件的Interactable属性控制界面交互时遇到的问题,包括VirtualizingTreeView不受Interactable影响及Button颜色变化失效的情况。通过分析源码,提出了针对性的解决方案,如自定义MayDrag函数来控制拖动和点击行为,并讨论了CanvasGroup的IgnoreParentGroup属性的影响。此外,还梳理了UGUI中与可交互性相关的类和函数,如Selectable.cs中的关键成员和函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文地址:https://blog.csdn.net/t163361/article/details/121566738
最近准备申请新星创作者,需要2000个粉丝关注,觉得文章有用的,请点一下左侧边栏的关注,谢谢。

界面框架使用的CanvasGroup组件的Interactable来作为界面是否可用的开关,使用过程中遇到几个问题

  • 引入RuntimeEditor中的VirtualizingTreeView控件作为列表控件,发现不受这个参数的影响
    这个问题是由于VirtualizingTreeView重写了点击逻辑,在父类VirtualizingItemsControl中自己写了一套点击拖动的逻辑,然后点击,拖动等行为没有针对Interactable的状态做修改。
    解决的话,参考InputField控件添加了一个MayDrag函数,然后再触发拖动,点击的地方加上判断,就可以解决这个
		private bool MayDrag(PointerEventData eventData)
        {
            return IsActive() &&
                IsInteractable() &&
                eventData.button == PointerEventData.InputButton.Left &&
                m_TextComponent != null &&
                (InPlaceEditing() || m_HideMobileInput);
        }
		public virtual void OnBeginDrag(PointerEventData eventData)
        {
            if (!MayDrag(eventData))
                return;

            m_UpdateDrag = true;
        }
        public virtual void OnDrag(PointerEventData eventData)
        {
            if (!MayDrag(eventData))
                return;
			.
            .
            .
        }
        public virtual void OnEndDrag(PointerEventData eventData)
        {
            if (!MayDrag(eventData))
                return;

            m_UpdateDrag = false;
        }
        public override void OnPointerDown(PointerEventData eventData)
        {
            if (!MayDrag(eventData))
                return;
            .
            .
            .
        }
  • 某些Button虽然功能正常,但是颜色没有正确变暗
    这个问题是Button控件的一个特性,Transition被设置为ColorTint方式时,可以正常看到效果,设置为其他选项都不会触发变暗的效果
  • 还有一个不是问题的问题
    当CanvasGroup中的Ignore Parent Group被勾选的话,也会导致这个CanvasGroup下面的控件只受当前这个CanvasGroup的影响了

原理梳理

可交互性这个功能再UGUI代码中有几个和CanvasGroup相关的一些函数和控件如下

  • CanvasGroup.cs并没有在UGUI中实现,而是在引擎的dll中实现的
  • 受CanvasGroup中的Interactable影响的控件的父类都是Selectable.cs,这个类中实现了可交互的功能
    继承Selectable的控件有,Button,DropDown,InputField,Scrollbar,Slider,Toggle
  • Selectable.cs中有如下几个重要成员和函数
    m_Interactable 本控件是否可交互
    m_GroupsAllowInteraction 本控件受父节点影响是否可交互
    IsInteractable() 当前控件是否可交互
    OnCanvasGroupChanged() 刷新m_GroupsAllowInteraction的可交互状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值