UGUI源码分析:开关组件Toggle与ToggleGroup

系列

UGUI源码分析系列总览
相关前置:
UGUI EventSystem源码分析
UGUI源码分析:Selectable交互组件的基类


Toggle

BaseClass: Selectable

Interface: IPointerClickHandler,ISubmitHandler,ICanvasElement

Intro: UGUI中常用于控制单选或者多选功能的组件,经常与ToggleGroup一起使用

  • IPointerClickHandler:点击事件的响应接口
  • ISubmitHandlerSubmit按键点击事件的响应接口。
  • ICanvasElement: Canvas元素(重建接口),当Canvas发生更新时执行重建操作

Toggle组件属性介绍

在这里插入图片描述

  • Interactable:是否可被交互(false时无法通过EventSystem进行交互)
  • Transition:状态变化过渡模式(相关详情
  • Navigation:导航(相关详情)
  • IsOn :Toggle状态属性
  • ToggleTransition :控制Graphic透明度变化的过渡模式(渐变/无)
  • Graphic :根据IsOn的值透明度会发生0或1的变化
  • Group : 用于绑定ToggleGroup组件

Toggle主要是通过一个bool值m_IsOn进行两种状态的切换(True/False),并通过一个监听事件传递状态的变化。

在这里插入图片描述

初始化过程

Enable阶段主要时将自身注册进ToggleGroup中,并根据当前状态执行特效变化。

Disable阶段会将自身从当前ToggleGroup组件中移除。

protected override void OnEnable()
{
    base.OnEnable();
    SetToggleGroup(m_Group, false);//含有ToggleGroup组件时,将自身注册进ToggleGroup中
    PlayEffect(true);//执行变化特效,渐变graphic的透明度
}

protected override void OnDisable()
{
    SetToggleGroup(null, false);//从当前的ToggleGroup中移除该组件
    base.OnDisable();
}

IsOn

toggle组件最核心的地方在于这个bool值,该值可以通过点击(OnPointerClick)、按键(OnSubmit)、以及ToggleGroup进行改变。当IsOn发生改变时:

//IsOn属性Set方法  value:变化值  sendCallback 是否执行监听事件:默认true
void Set(bool value,bool sendCallback)
{
    if (m_IsOn == value)
        return;
    m_IsOn = value;
    if (m_Group != null && IsActive())
    {
        //当存在Group时,自身的变化需要通知Group,使其控制其他Toggle的状态
        if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
        {
            m_IsOn = true;
            m_Group.NotifyToggleOn(this);
        }
    }
    //执行变化特效,渐变graphic的透明度0或1
    PlayEffect(toggleTransition == ToggleTransition.None);
    if (sendCallback)
    {
        UISystemProfilerApi.AddMarker("Toggle.value", this);
        onValueChanged.Invoke(m_IsOn);//执行监听事件
    }
}

ToggleGroup

在这里插入图片描述

ToggleGroup组件用来帮助Toggle捆绑成组,使其完成X选1或者多选的功能。它管理了一个List<Toggle>,当Toggle初始化时,会将自身注册进List中,到被销毁时会将自身移除。

ToggleGroup向外提供了一个bool值属性 allowSwitchOff 来控制一组Toggle中是否运行出现全是OFF的状态。

//Toggle组件IsOn属性Set方法中一段
if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
{
    //当Group.allowSwitchOff为false时将默认被操作的Toggle的IsOn设置为True
    m_IsOn = true;
    m_Group.NotifyToggleOn(this);
}

在单选模式中(allowSwitchOff = false): 当一组Toggle中出现点击或是Submit操作时,会将其IsOn变化为True状态并执行Group的NotifyToggleOn方法,该方法会遍历其List中除此之外的所有Toggle,使它们变为False状态

public void NotifyToggleOn(Toggle toggle)
{
    ValidateToggleIsInGroup(toggle);//判断当前Toggle是否存在List中
    //遍历出当前Toggle外的所有Tgoole,改变它们的状态为False
    for (var i = 0; i < m_Toggles.Count; i++)
    {
        if (m_Toggles[i] == toggle)
            continue;
        m_Toggles[i].isOn = false;
    }
}

.
.
.
.
.


嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)


原创文章 39 获赞 59 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28820675/article/details/106036983