UGUI_Dropdown 多次点击同一项无回调?

栏目: ASP.NET · 发布时间: 6年前

内容简介:截止目前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 &lt; 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组件,重新关联属性面板上的引用。

UGUI_Dropdown 多次点击同一项无回调?


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

乔纳森传

乔纳森传

利恩德·卡尼 / 汪琪 岳卉 王文雅 / 中信出版社 / 2014-1-1 / 49

抛开苹果公司,单就设计行业来讲,乔纳森也是一个特殊的人物。他推动了设计行业的大变革:不再为产品增加看起来炫得多的配件,而是要去掉多余的东西。 ——陈向东 终于有一本书能够如此地接地气:它不再关注那位神一样的乔布斯,而是关注那位站在神的背后,同样具有神一样光环的乔纳森。 ——孙陶然 乔纳森•艾夫把他自己对科学、人文、艺术,乃至整个世界的感知尽数渗透进苹果的设计和审美之中,他是......一起来看看 《乔纳森传》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具