EnergyEfficiencyManagement/Assets/Zion/Scripts/MultiDropdownController.cs

111 lines
3.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string> options = new List<string> { "选项1", "选项2", "选项3" }; // 可编辑的选项列表
// 存储所有实例化的Toggle
private List<Toggle> activeToggles = new List<Toggle>();
// 存储当前选中的选项文本
private List<string> selectedOptions = new List<string>();
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>().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<string> GetSelectedOptions()
{
return new List<string>(selectedOptions); // 返回副本以防止外部修改内部数据
}
// 外部设置选项(可用于动态改变下拉菜单内容)
public void SetOptions(List<string> newOptions)
{
options = newOptions;
GenerateOptions(); // 重新生成UI
selectedOptions.Clear();
UpdateMainButtonText();
}
}