using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using System.Linq; public class MultiDropdownController : MonoBehaviour { [Header("UI 引用")] [SerializeField] private Button mainButton; // 触发下拉的主按钮 [SerializeField] private Text mainButtonText; // 主按钮上的文字 [SerializeField] private GameObject dropdownPanel; // 包含所有Toggle的面板 [SerializeField] private Toggle itemTemplate; // 选项Toggle的预制体 [Header("选项数据")] [SerializeField] private List options = new List { "选项1", "选项2", "选项3" }; // 可编辑的选项列表 // 存储所有实例化的Toggle private List activeToggles = new List(); // 存储当前选中的选项文本 private List selectedOptions = new List(); void Start() { // 初始隐藏下拉面板 dropdownPanel.SetActive(false); // 主按钮点击事件:切换面板显示/隐藏 mainButton.onClick.AddListener(ToggleDropdownPanel); // 用选项数据生成Toggle GenerateOptions(); } // 生成所有选项Toggle private void GenerateOptions() { // 清除旧的(如果有的话) foreach (var toggle in activeToggles) { Destroy(toggle.gameObject); } activeToggles.Clear(); // 为每个选项创建一个Toggle for (int i = 0; i < options.Count; i++) { Toggle newToggle = Instantiate(itemTemplate, dropdownPanel.transform); newToggle.gameObject.SetActive(true); newToggle.GetComponentInChildren().text = options[i]; // 为Toggle的OnValueChanged事件添加监听 int index = i; // 闭包问题,需要捕获当前索引 newToggle.onValueChanged.AddListener((isOn) => OnToggleValueChanged(index, isOn)); activeToggles.Add(newToggle); } } // Toggle状态改变时的回调 private void OnToggleValueChanged(int optionIndex, bool isOn) { string optionText = options[optionIndex]; if (isOn && !selectedOptions.Contains(optionText)) { selectedOptions.Add(optionText); } else if (!isOn && selectedOptions.Contains(optionText)) { selectedOptions.Remove(optionText); } UpdateMainButtonText(); } // 更新主按钮的显示文本 private void UpdateMainButtonText() { if (selectedOptions.Count == 0) { mainButtonText.text = "请选择..."; } else if (selectedOptions.Count == 1) { mainButtonText.text = selectedOptions[0]; } else { mainButtonText.text = $"已选择 {selectedOptions.Count} 项"; // 或者显示选中的前几项:mainButtonText.text = string.Join(", ", selectedOptions.Take(2)) + "..."; } } // 切换下拉面板的显示状态 private void ToggleDropdownPanel() { bool isActive = !dropdownPanel.activeSelf; dropdownPanel.SetActive(isActive); } // 外部获取当前选中项的方法 public List GetSelectedOptions() { return new List(selectedOptions); // 返回副本以防止外部修改内部数据 } // 外部设置选项(可用于动态改变下拉菜单内容) public void SetOptions(List newOptions) { options = newOptions; GenerateOptions(); // 重新生成UI selectedOptions.Clear(); UpdateMainButtonText(); } }