内容简介:截止目前Unity2018.3.3版本下的UGUI Dropdown依旧如题。当然,目前的功能是基本能满足大部分场景应用的。但如果你需要每次点击都有回调的话,那么,你就需要扩展或者重写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<Toggle>(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.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<Toggle>(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); } }
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组件,重新关联属性面板上的引用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- react-native-wechat安卓点击登录没有回调问题
- [OC] 关于block回调、高阶函数“回调再调用”及项目实践
- 即使回调IsOneWay,WCF客户端也会因回调而死锁
- Java 回调机制解读
- 如何避免回调地狱
- 如何使用JPA回调?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。