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 多次点击同一项无回调?


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

查看所有标签

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

Database Design and Implementation

Database Design and Implementation

Edward Sciore / Wiley / 2008-10-24 / 1261.00 元

* Covering the traditional database system concepts from a systems perspective, this book addresses the functionality that database systems provide as well as what algorithms and design decisions will......一起来看看 《Database Design and Implementation》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具