UGUI_Dropdown 多次点击同一项无回调?
截止目前Unity2018.3.3版本下的UGUI Dropdown依旧如题。
当然,目前的功能是基本能满足大部分场景应用的。
但如果你需要每次点击都有回调的话,那么,你就需要扩展或者重写Dropdown。
我们新建一个类:DropdownExtent,并且让它继承Dropdown,然后重写OnPointerClick:
using UnityEngine.EventSystems; using UnityEngine.UI; public class DropdownExtend : Dropdown { public bool AlwaysCallback = false; public void Show() { base.Show(); var toggleRoot = transform.Find("Dropdown List/Viewport/Content"); var toggleList = toggleRoot.GetComponentsInChildren(false); foreach (var temp in toggleList) { temp.onValueChanged.RemoveAllListeners(); temp.isOn = false; var temp1 = temp; temp.onValueChanged.AddListener(x => OnSelectItemExtend(temp1)); } } public override void OnPointerClick(PointerEventData eventData) { Show(); } public void OnSelectItemExtend(Toggle toggle) { if (!toggle.isOn) { toggle.isOn = true; return; } var selectedIndex = -1; var tr = toggle.transform; var parent = tr.parent; for (var i = 0; i < parent.childCount; i++) { if (parent.GetChild(i) != tr) continue; selectedIndex = i - 1; break; } if (selectedIndex < 0) return; if (value == selectedIndex && AlwaysCallback) onValueChanged.Invoke(value); else value = selectedIndex; Hide(); } }
测试代码:
using UnityEngine; public class Test : MonoBehaviour { public DropdownExtend _dropdownEx; void Start() { _dropdownEx.AlwaysCallback = true; _dropdownEx.onValueChanged.AddListener(OnChanged); } private void OnChanged(int index) { Debug.Log(index); } }
说明:
- 扩展类将替换掉原来的Dropdown组件,重新关联属性面板上的引用。