Today,有个小同志问了我一个关于UGUI的Toggle的问题,说能不能实现多选,当时我就想ToggleGroup应该就可以,结果试了试,并没有什么卵用,ToggleGroup只是单选。所以就有了现在的这个文章,在这里还要感谢那位小同志,不然我还发现不了这个问题。好了,下面说一下实现原理。其实,原理还是很简单的,就是获取所有的Toggle,然后看哪个是开启状态,然后判断是否达到可多选的最大数量,如果够了,就把剩下的未选中的屏蔽掉。不能继续选择,如果想要换选项,可以把选中的变成未选中的,继续选择。废话不多说,下面是代码。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 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。文章源自大腿Plus-https://www.zhaoshijun.com/archives/1209
文章源自大腿Plus-https://www.zhaoshijun.com/archives/1209 文章源自大腿Plus-https://www.zhaoshijun.com/archives/1209
					我的微信
				
				微信扫一扫
				 
					shijun_z
					
					我的QQ
				
				QQ扫一扫
				 
					846207670
					 
							

 
					
评论