Unity Toggle的勾选关联

最近工作太忙了 没有时间学习 也没时间更博
不过昨天马三小伙儿问了我一个他们公司的需求 帮他想了一下思路 顺便作为一个脚本发个帖吧
顺便祝贺我转正成功

需求:
左侧勾选区域逻辑优化
a. 勾选全部后,所有选项添加勾选状态
b. 勾选全部后,手动去掉任意颜色的勾选(除全部外),全部勾选同时去掉
c. 全部勾选状态下,再次点击全部,取消所有勾选状态
d. 所有颜色的勾选都选中后,自动将将全部选项也勾选上

这个需求其实在真正项目中挺常见的emmmmm 不过就是逻辑上比较烦

实现:
用的原生接口 可以直接复制使用
Prefab很简单 只是一个总开关和子开关 因为可以多选 所以没有ToggleGroup
在这里插入图片描述
以及一个脚本 因为只是做简单的例子 所以数量什么的都写死了
在这里插入图片描述
代码:
变量部分

	[Header("总开关")]
    public Toggle allToggle;
    [Header("子开关列表")]
    public List<Toggle> singleToggleList;

    //当前toggle状态
    private EToggleState state = EToggleState.None;
    //当前开启singleToggle数量
    private int singlToggleOnNum = 0;
    //toggle状态
    private enum EToggleState
    {
        None = 0,   //全关
        All = 1,    //全开
        Some = 2,   //部分开启
    }

逻辑部分

    void Start()
    {
        //监听总开关
        allToggle.onValueChanged.AddListener((bool value) =>
        {
            if (value == true)
            {
                state = EToggleState.All;
                AllSingleToggleOn(value);
            }
            else
            {
                //只有全部打开时才能全部关掉 这样关闭一个子开关不会影响总开关整体逻辑
                if (state == EToggleState.All)
                {
                    state = EToggleState.None;
                    AllSingleToggleOn(value);
                }
            }
        });
        //监听子开关
        foreach (Toggle singleToggle in singleToggleList)
        {
            singleToggle.onValueChanged.AddListener((bool value) =>
            {
                //先做子开关的逻辑
                state = EToggleState.Some;
                if (value == true)
                {
                    singlToggleOnNum++;
                    //所有都打开时 开启总开关
                    if (singlToggleOnNum == singleToggleList.Count)
                    {
                        state = EToggleState.All;
                        allToggle.isOn = true;
                    }
                }
                else
                {
                    //有子开关关闭 就一并关闭总开关
                    singlToggleOnNum--;
                    allToggle.isOn = false;
                    //全部关闭时改变状态
                    if (singlToggleOnNum == 0)
                    {
                        state = EToggleState.None;
                    }
                }
                //这里可以做子开关开启或关闭的逻辑处理
                string name = singleToggle.gameObject.name;
                Debug.Log("State of <color=#AAFF00>" + name + "</color> is <color=#AAFF00>" + value + "</color>");
            });
        }
    }

    //开启或关闭全部子开关
    private void AllSingleToggleOn(bool state)
    {
        foreach(Toggle singleToggle in singleToggleList)
        {
            singleToggle.isOn = state;
        }
    }

顺便推一下马三小伙儿 说不定这里有你想要的
https://www.cnblogs.com/msxh/
https://github.com/XINCGer

猜你喜欢

转载自blog.csdn.net/qql7267/article/details/88019987