Отключить опцию (ы) в выпадающем Unity - PullRequest
1 голос
/ 22 марта 2019

Мне нужно отключить 1 (или 2) опцию выпадающего меню в Unity.enter image description here Раскрывающееся меню не должно быть заполнено .
Не должно быть никаких опций удаления / деактивации из выпадающего меню

Кто-нибудь знает, как это сделать.?

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Аналогично этому ответу , но немного другому подходу.

В другом ответе используется жестко закодированный toggle.name == "Item 1: Option B" для сравнения кнопок.Я бы предпочел использовать центральную систему, основанную на индексах:

Поместите этот компонент в DropDown

[RequireComponent(typeof(Dropdown))]
[DisallowMultipleComponent]
public class DropDownController : MonoBehaviour, IPointerClickHandler
{
    [Tooltip("Indexes that should be ignored. Indexes are 0 based.")]
    public List<int> indexesToDisable = new List<int>();

    private Dropdown _dropdown;

    private void Awake()
    {
        _dropdown = GetComponent<Dropdown>();
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        var dropDownList = GetComponentInChildren<Canvas>();
        if (!dropDownList) return;

        // If the dropdown was opened find the options toggles
        var toogles = dropDownList.GetComponentsInChildren<Toggle>(true);

        // the first item will allways be a template item from the dropdown we have to ignore
        // so we start at one and all options indexes have to be 1 based
        for (var i = 1; i < toogles.Length; i++)
        {
            // disable buttons if their 0-based index is in indexesToDisable
            // the first item will allways be a template item from the dropdown
            // so in order to still have 0 based indexes for the options here we use i-1
            toogles[i].interactable = !indexesToDisable.Contains(i - 1);
        }
    }

    // Anytime change a value by index
    public void EnableOption(int index, bool enable)
    {
        if (index < 1 || index > _dropdown.options.Count)
        {
            Debug.LogWarning("Index out of range -> ignored!", this);
            return;
        }

        if (enable)
        {
            // remove index from disabled list
            if (indexesToDisable.Contains(index)) indexesToDisable.Remove(index);
        }
        else
        {
            // add index to disabled list
            if (!indexesToDisable.Contains(index)) indexesToDisable.Add(index);
        }

        var dropDownList = GetComponentInChildren<Canvas>();
        // If this returns null than the Dropdown was closed
        if (!dropDownList) return;

        // If the dropdown was opened find the options toggles
        var toogles = dropDownList.GetComponentsInChildren<Toggle>(true);
        toogles[index].interactable = enable;

    }

    // Anytime change a value by string label
    public void EnableOption(string label, bool enable)
    {
        var index = _dropdown.options.FindIndex(o => string.Equals(o.text, label));

        // We need a 1-based index
        EnableOption(index + 1, enable);
    }
}

Настройка в Инспекторе

enter image description here

или с помощью сценариев, например

dropDownReference.GetComponent<DropDownController>().EnableOption("Option B", false);

enter image description here

1 голос
/ 22 марта 2019

Этого можно добиться, используя компонент Toggle из DropDown-> Template-> ViewPort-> Content-> Item.

Этот сценарий создает элементы каждый раз, когда выбрано меню DropDown.Вы можете просто получить доступ к Toogle и отключить интерактивное поле следующим образом:

void Start () 
{
    //This script should be attached to Item
    Toggle toggle = gameObject.GetComponent<Toggle>();
    Debug.Log(toggle);
    if (toggle != null && toggle.name == "Item 1: Option B")
    {
        toggle.interactable = false;
    }
}

Вы также можете видеть, что список DropDown создается каждый раз, когда стрелка на DrowDown нажимается и уничтожается при закрытии меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...