本文地址: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的可交互状态

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

1144

被折叠的 条评论
为什么被折叠?



