111 lines
3.6 KiB
C#
111 lines
3.6 KiB
C#
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();
|
||
}
|
||
} |