Unity UI 多选下拉框

/***********************************************
Copyright (C) 2018 The Company Name
File Name:           MultiDropDown.cs
Author:              拾忆丶夜
UnityVersion:       #UnityVersion#
CreateTime:          2022/8/18 14:59:14#
Description:
***********************************************/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MultiDropDown : MonoBehaviour
{
    public Text valueText;

    public RectTransform dropdownScrollView;

    public RectTransform content;

    public GameObject togglePerfab;

    private Toggle selfToggle;

    private List<Toggle> toggleList = new List<Toggle>();

    private List<Toggle> selectedList = new List<Toggle>();

    private RectTransform canvasRect;

    private float itemHeight, originalHeight,offset;

    void Awake()
    {
        canvasRect = GameObject.Find("Canvas").GetComponent<RectTransform>();

        selfToggle = GetComponent<Toggle>();

        selfToggle.onValueChanged.AddListener((ison) => 
        {
            if (ison)
            {
                ShowScrollViewOnTopLayer();
            }
            else
            {
                HideScrollViewInSlefChildren();
            }
        });
    }

    void OnDisable()
    {
        selfToggle.isOn = false;
    }

    public void InitScrollView(string[] values)
    {
        for (int i = 0; i < values.Length; i++)
        {
            GameObject item = Instantiate(togglePerfab, content);

            item.SetActive(true);

            Toggle toggle = item.GetComponent<Toggle>();

            toggleList.Add(toggle); 

            Text nameText = item.GetComponentInChildren<Text>();

            nameText.text = values[i];

            string nowValue = values[i];

            toggle.onValueChanged.AddListener((ison) =>
            {
                if (ison)
                {
                    selectedList.Add(toggle);
                }
                else
                {
                    selectedList.Remove(toggle);
                }

                UpdateValueText();
            });
        }

        ResizeContentSize();

        SetAsDefault();
    }

    public void InitScrollView(List<string> values)
    {
        Debug.Log("初始化下拉框");

        for (int i = 0; i < values.Count; i++)
        {
            GameObject item = Instantiate(togglePerfab, content);

            item.SetActive(true);

            Toggle toggle = item.GetComponent<Toggle>();

            toggleList.Add(toggle);

            Text nameText = item.GetComponentInChildren<Text>();

            nameText.text = values[i];

            string nowValue = values[i];

            toggle.onValueChanged.AddListener((ison) =>
            {
                if (ison)
                {
                    selectedList.Add(toggle);
                }
                else
                {
                    selectedList.Remove(toggle);
                }

                UpdateValueText();
            });
        }

        ResizeContentSize();

        SetAsDefault();
    }

    private void UpdateValueText()
    {
        valueText.text = "";

        for (int i = 0; i < selectedList.Count; i++)
        {
            string a = selectedList[i].GetComponentInChildren<Text>().text;

            valueText.text += (valueText.text != "" ? "," : "") + a;
        }
    }

    private void ShowScrollViewOnTopLayer()
    {
        dropdownScrollView.SetParent(canvasRect);

        dropdownScrollView.SetAsLastSibling();

        dropdownScrollView.position = transform.position;

        dropdownScrollView.gameObject.SetActive(true);
    }

    private void HideScrollViewInSlefChildren()
    {
        dropdownScrollView.SetParent(transform.parent);

        dropdownScrollView.gameObject.SetActive(false);
    }

    public void SetAsDefault()
    {
        Debug.Log("设置为默认");

        for (int i = 0; i < toggleList.Count; i++)
        {
            toggleList[i].isOn = i == 0;
        }
    }

    public void SetAsCustom(string aimValue)
    {
        foreach (var item in toggleList)
        {
            item.isOn = false;
        }

        string[] aimArray = aimValue.Split(',');
        for (int i = 0; i < aimArray.Length; i++)
        {
            var result = toggleList.Find(s => s.GetComponentInChildren<Text>().text == aimArray[i]);
            if (result != null)
            {
                result.isOn = true;
            }
        }
    }

    public void ClearOptions()
    {
        selectedList.Clear();

        for (int i = 0; i < toggleList.Count; i++)
        {
            DestroyImmediate(toggleList[i].gameObject);
        }
        toggleList.Clear();
    }

    private void ResizeContentSize()
    {
        itemHeight = togglePerfab.GetComponent<RectTransform>().rect.height;

        originalHeight = content.rect.height;

        offset = content.GetComponent<VerticalLayoutGroup>().padding.top + content.GetComponent<VerticalLayoutGroup>().padding.bottom;

        float height = toggleList.Count * itemHeight + offset;

        Debug.Log("正确高度:" + height);

        content.sizeDelta = new Vector2(content.sizeDelta.x, height > originalHeight ? height : originalHeight);
    }
}

仅作为记录

猜你喜欢

转载自blog.csdn.net/qq_33325776/article/details/126408990