using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using System; using System.Diagnostics; [RequireComponent(typeof(ToggleGroup))] public class ToggleTab : MonoBehaviour { private ToggleGroup toggleGroup; private List toggles; private Toggle currentSelectToggle; private int currentSelectedIndex; private List> selectedListener; private List> unselectedListener; private bool isInit = false; private void Awake() { Init(); } private void Init() { if (isInit) { return; } isInit = true; selectedListener = new List>(3); unselectedListener = new List>(3); toggles = new List(); toggleGroup = GetComponent(); GetComponentsInChildren(true, toggles); for (int i = 0; i < toggles.Count; i++) { Toggle toggle = toggles[i]; toggle.group = toggleGroup; toggle.onValueChanged.AddListener(OnTabChange); if (toggle.isOn) { if (currentSelectToggle == null) { currentSelectToggle = toggle; } else { toggle.isOn = false; } } } } public string GetSelectedName() { if(currentSelectToggle!= null) { return currentSelectToggle.name; } return null; } public void SetSelectedName(string toggleName) { for (int i = 0; i < toggles.Count; i++) { if (toggles[i].name == toggleName) { if (!toggles[i].isOn) { toggles[i].isOn = true; } break; } } } public int GetSelectedIndex() { if (currentSelectToggle != null) { return toggles.IndexOf(currentSelectToggle); } return -1; } public void SetSelectedIndex(int index) { if (index >= 0 && index < toggles.Count) { toggles[index].isOn = true; } } public int AddToggle(Toggle toggle) { if (toggle != null) { bool isExist = toggles.Contains(toggle); if (!isExist) { toggle.isOn = false; toggle.group = toggleGroup; toggles.Add(toggle); return toggles.Count; } } return -1; } public void RemoveToggle(Toggle toggle) { if (toggle != null) { int index = toggles.IndexOf(toggle); if (index >= 0) { toggles.RemoveAt(index); if (currentSelectToggle == toggle) { currentSelectToggle = null; currentSelectedIndex = -1; if (toggles.Count > 0) { currentSelectToggle = toggles[0]; currentSelectToggle.isOn = true; currentSelectedIndex = 0; } } else { for (int i = index; i < toggles.Count; i++) { if (currentSelectToggle == toggles[i]) { currentSelectedIndex = i; break; } } } } } } public void AddSelectedListener(Action listener) { Init(); selectedListener.Add(listener); } public void AddUnselectedListener(Action listener) { unselectedListener.Add(listener); } public void RemoveSelectedListener(Action listener) { selectedListener.Remove(listener); } public void RemoveAllSelectedListeners() { selectedListener.Clear(); } public void RemoveUnselectedListener(Action listener) { unselectedListener.Remove(listener); } public void RemoveAllUnselectedListeners() { unselectedListener.Clear(); } private void OnTabChange(bool isSelect) { if (isSelect) { for (int i = 0; i < toggles.Count; i++) { Toggle toggle = toggles[i]; if (toggle.isOn) { if (toggle == currentSelectToggle) { return; } if (currentSelectToggle != null) { CallUnselectedListener(currentSelectToggle, currentSelectedIndex + 1); } currentSelectToggle = toggle; currentSelectedIndex = i; CallSelectedListener(currentSelectToggle, currentSelectedIndex + 1); break; } } } } private void CallSelectedListener(Toggle toggle, int index) { for (int i = selectedListener.Count - 1; i >= 0; i--) { selectedListener[i]?.Invoke(toggle.name, index); } } private void CallUnselectedListener(Toggle toggle, int index) { for (int i = unselectedListener.Count - 1; i >= 0; i--) { unselectedListener[i]?.Invoke(toggle.name, index); } } private void OnDestroy() { RemoveAllSelectedListeners(); RemoveAllUnselectedListeners(); toggles.Clear(); selectedListener = null; } }