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

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

内容简介:截止目前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 多次点击同一项无回调?


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

查看所有标签

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

编程语言实现模式

编程语言实现模式

Terence Parr / 李袁奎、尧飘海 / 华中科技大学出版社 / 2012-3-20 / 72.00元

《编程语言实现模式》旨在传授开发语言应用(工具)的经验和理念,帮助读者构建自己的语言应用。这里的语言应用并非特指用编译器或解释器实现编程语言,而是泛指任何处理、分析、翻译输入文件的程序,比如配置文件读取器、数据读取器、模型驱动的代码生成器、源码到源码的翻译器、源码分析工具、解释器,以及诸如此类的工具。为此,作者举例讲解已有语言应用的工作机制,拆解、归纳出31种易于理解且常用的设计模式(每种都包括通......一起来看看 《编程语言实现模式》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具