unity UGUI下拉列表中,以TMP_Dropdown为例,当默认值为0时,点击第一个选项,点击事件并不会响应,然而在某些特定情况下,我们需要在DropDown的Value字段值不变化时,点击也会响应事件,这样我们就需要重写TMP_DropDown。
代码如下
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DBDropDown : TMP_Dropdown, IPointerClickHandler
{
public bool Call = true;//是否开启 点击选项按钮总是回调
protected override void Awake()
{
base.Awake();
template = transform.Find("Template").GetComponent<RectTransform>();
captionText = transform.Find("Label").GetComponent<TMP_Text>();
itemText = transform.Find("Template/Viewport/Content/Item/Item Label").GetComponent<TMP_Text>();
}
public void MyShow()
{
Show();
Transform toggleRoot = transform.Find("Dropdown List/Viewport/Content");
Toggle[] toggleList = toggleRoot.GetComponentsInChildren<Toggle>(false);
for (int i = 0; i < toggleList.Length; i++)
{
Toggle temp = toggleList[i];
temp.onValueChanged.RemoveAllListeners();
// temp.isOn = false;
int index = i;
temp.onValueChanged.AddListener(x => OnSelectItemEx(x,index,temp));
}
}
public override void OnPointerClick(PointerEventData eventData)
{
MyShow();
}
public void OnSelectItemEx(bool ison, int index,Toggle t)
{
if (!ison)
{
if (value == index && Call)
{
// onValueChanged.Invoke(value);
t.isOn = true;
}
captionText.text = options[value].text;
return;
}
captionText.text = options[value].text;
if (value == index && Call)
onValueChanged.Invoke(value);
else
value = index;
Hide();
}
}
其中Show和Hide函数是显示与隐藏下拉选项的UI