using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; //武将筛选 public class HeroSelectBehaviour : MonoBehaviour { [SerializeField] Transform unFoldForm; //展开后的容器 [SerializeField] Button foldBtn; //收起按钮 [SerializeField] Transform foldForm; //收起容器 [SerializeField] Button unFoldBtn; //展开按钮 [SerializeField] Toggle[] jobsBtn; [SerializeField] Toggle[] countrysBtn; [SerializeField] Toggle[] hurtTypeBtn; [SerializeField] Toggle[] specialType6Btn; [SerializeField] Transform specialTypeMoreRect; [SerializeField] ClickScreenOtherSpaceEvent clickScreenOtherSpaceEvent; [SerializeField] Button resetBtn; Toggle[] specialTypeMoreBtn; int m_Job = 0; //职业 多选项按位存储 int m_Country = 0; //国家 多选项位按存储 int m_HurtType = 0; //伤害类型 多选项位按存储 int m_SpecialType6 = 0; //6大战斗属性 多选项位按存储 int m_SpecialTypeMore = 0; //特殊属性 多选项位按存储 int foldState = 0; //0 收起,1 展开 //点击按钮需通知响应外部事件 private Action> selectAction; void Awake() { foldBtn.AddListener(() => { foldState = 0; RefreshFolState(); }); unFoldBtn.AddListener(() => { foldState = 1; RefreshFolState(); }); specialTypeMoreBtn = specialTypeMoreRect.GetComponentsInChildren(); // 初始化特殊属性按钮的显示和文本 for (int i = 0; i < specialTypeMoreBtn.Length; i++) { if (i < HeroUIManager.Instance.heroSpecialAttrsForSelect.Count) { int index = HeroUIManager.Instance.heroSpecialAttrsForSelect[i]; specialTypeMoreBtn[i].SetActive(true); specialTypeMoreBtn[i].GetComponentInChildren().text = Language.Get($"HeroSpecialty2_{index}"); } else { specialTypeMoreBtn[i].SetActive(false); } } // 添加所有Toggle监听器 AddAllListeners(); clickScreenOtherSpaceEvent.AddListener(() => { if (foldState == 0) return; foldBtn.onClick.Invoke(); }); resetBtn.AddListener(Reset); } // 移除所有Toggle监听器 void RemoveAllListeners() { for (int i = 0; i < jobsBtn.Length; i++) { jobsBtn[i].onValueChanged.RemoveAllListeners(); } for (int i = 0; i < countrysBtn.Length; i++) { countrysBtn[i].onValueChanged.RemoveAllListeners(); } for (int i = 0; i < hurtTypeBtn.Length; i++) { hurtTypeBtn[i].onValueChanged.RemoveAllListeners(); } for (int i = 0; i < specialType6Btn.Length; i++) { specialType6Btn[i].onValueChanged.RemoveAllListeners(); } for (int i = 0; i < specialTypeMoreBtn.Length; i++) { specialTypeMoreBtn[i].onValueChanged.RemoveAllListeners(); } } // 添加所有Toggle监听器 void AddAllListeners() { for (int i = 0; i < jobsBtn.Length; i++) { int index = i + 1; jobsBtn[i].onValueChanged.AddListener((bool value) => { m_Job = value ? m_Job | (1 << index) : m_Job & ~(1 << index); selectAction?.Invoke(new List() { m_Job, m_Country, m_HurtType, m_SpecialType6, m_SpecialTypeMore }); }); } for (int i = 0; i < countrysBtn.Length; i++) { int index = i + 1; countrysBtn[i].onValueChanged.AddListener((bool value) => { m_Country = value ? m_Country | (1 << index) : m_Country & ~(1 << index); selectAction?.Invoke(new List() { m_Job, m_Country, m_HurtType, m_SpecialType6, m_SpecialTypeMore }); }); } for (int i = 0; i < hurtTypeBtn.Length; i++) { int index = i + 1; hurtTypeBtn[i].onValueChanged.AddListener((bool value) => { m_HurtType = value ? m_HurtType | (1 << index) : m_HurtType & ~(1 << index); selectAction?.Invoke(new List() { m_Job, m_Country, m_HurtType, m_SpecialType6, m_SpecialTypeMore }); }); } for (int i = 0; i < specialType6Btn.Length; i++) { int index = i + 1; specialType6Btn[i].onValueChanged.AddListener((bool value) => { m_SpecialType6 = value ? m_SpecialType6 | (1 << index) : m_SpecialType6 & ~(1 << index); selectAction?.Invoke(new List() { m_Job, m_Country, m_HurtType, m_SpecialType6, m_SpecialTypeMore }); }); } for (int i = 0; i < specialTypeMoreBtn.Length; i++) { if (i < HeroUIManager.Instance.heroSpecialAttrsForSelect.Count) { int index = HeroUIManager.Instance.heroSpecialAttrsForSelect[i]; specialTypeMoreBtn[i].onValueChanged.AddListener((bool value) => { m_SpecialTypeMore = value ? m_SpecialTypeMore | (1 << index) : m_SpecialTypeMore & ~(1 << index); selectAction?.Invoke(new List() { m_Job, m_Country, m_HurtType, m_SpecialType6, m_SpecialTypeMore }); }); } } } /// /// 国家职业筛选 /// /// 0收起,1展开 /// 点击按钮需通知响应外部事件 /// 回调参数: 职业,国家,伤害类型,6大战斗属性,特殊属性 public void Display(int state, Action> onRefresh) { foldState = state; RefreshFolState(); selectAction = onRefresh; Reset(); } //刷新展开收起状态 void RefreshFolState() { unFoldForm.SetActive(foldState == 1); foldForm.SetActive(foldState == 0); if (foldState == 1) { UIHelper.ForceRefreshLayout(unFoldForm).Forget(); } } public static HeroSelectBehaviour Create(Transform heroSelectBehaviour) { var instanceGO = UIUtility.CreateWidget("HeroSelectBehaviour", "HeroSelectBehaviour"); instanceGO.transform.SetParentEx(heroSelectBehaviour, Vector3.zero, Quaternion.identity, Vector3.one); return instanceGO.GetComponent(); } void Reset() { // 暂时移除所有监听器避免重置时多次触发 RemoveAllListeners(); m_Job = 0; m_Country = 0; m_HurtType = 0; m_SpecialType6 = 0; m_SpecialTypeMore = 0; for (int i = 0; i < jobsBtn.Length; i++) { jobsBtn[i].isOn = false; } for (int i = 0; i < countrysBtn.Length; i++) { countrysBtn[i].isOn = false; } for (int i = 0; i < hurtTypeBtn.Length; i++) { hurtTypeBtn[i].isOn = false; } for (int i = 0; i < specialType6Btn.Length; i++) { specialType6Btn[i].isOn = false; } for (int i = 0; i < specialTypeMoreBtn.Length; i++) { specialTypeMoreBtn[i].isOn = false; } // 重新添加监听器 AddAllListeners(); selectAction?.Invoke(new List() { m_Job, m_Country, m_HurtType, m_SpecialType6, m_SpecialTypeMore }); } }