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