Unity3D:ToggleGroupPro实现Toggle多项选择

Today,有个小同志问了我一个关于UGUI的Toggle的问题,说能不能实现多选,当时我就想ToggleGroup应该就可以,结果试了试,并没有什么卵用,ToggleGroup只是单选。所以就有了现在的这个文章,在这里还要感谢那位小同志,不然我还发现不了这个问题。好了,下面说一下实现原理。其实,原理还是很简单的,就是获取所有的Toggle,然后看哪个是开启状态,然后判断是否达到可多选的最大数量,如果够了,就把剩下的未选中的屏蔽掉。不能继续选择,如果想要换选项,可以把选中的变成未选中的,继续选择。废话不多说,下面是代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ToggleGroupPro : MonoBehaviour
{
    public int OptionsNumber = 0;

    private List<Toggle> m_Toggles = new List<Toggle>();
    public List<Toggle> Toggles
    {
        get
        {
            for (int i = 0; i < transform.childCount; i++)
            {
                GameObject go = transform.GetChild(i).gameObject;
                if (go.activeSelf)
                {
                    Toggle t = go.GetComponent<Toggle>();
                    if (t == null) continue;
                    if (!m_Toggles.Contains(t))
                    {
                        m_Toggles.Add(t);
                    }
                }
            }
            return m_Toggles;
        }
    }

    private List<Toggle> m_ActiveToggles = new List<Toggle>();
    public List<Toggle> ActiveToggles
    {
        get
        {
            return Toggles.GetNumberofBoolean(true);
        }
    }

    private void Awake()
    {
        OptionsNumber = OptionsNumber < Toggles.Count ? OptionsNumber : Toggles.Count;
    }
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < Toggles.Count; i++)
        {
            Toggles[i].onValueChanged.AddListener(OnTogglesValueChanged);
        }
    }

    public void OnTogglesValueChanged(bool value)
    {
        for (int i = 0; i < Toggles.Count; i++)
        {
            Toggles[i].interactable = (ActiveToggles.Count >= OptionsNumber) && !Toggles[i].isOn ? false : true;
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}
public static class Develop
{
    public static List<Toggle> GetNumberofBoolean(this List<Toggle> toggles, bool value)
    {
        List<Toggle> ts = new List<Toggle>();
        for (int i = 0; i < toggles.Count; i++)
        {
            if (toggles[i].isOn == value)
            {
                if (!ts.Contains(toggles[i]))
                {
                    ts.Add(toggles[i]);
                }
            }
        }
        return ts;
    }
}

只要将上面的代码拖到Toggle的父物体上就可以了。可以设置可选择的数量。也可以获取到所有选中的Toggle。

You May Also Like

About the Author: 大腿Plus

发表评论