Override Dropdown Component

技术交流群:806091680 ! Chinar 欢迎你的加入
END
| 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) |
| Chinar —— 心分享、心创新! 为实现下拉菜单/ Dropdown 每个按钮可用性,提供解决方案 为新手节省宝贵的时间,避免采坑! |
Chinar 教程效果:
全文高清图片,点击即可放大观看 (很多人竟然不知道)
1
De ion —— 说明
Unity UGUI 之后提供了下拉菜单、简单的解决方案使我们可以快速的创建下拉菜单
但在有些情况下,无法满足需求
例如:下拉菜单弹出时,首选项是被选中状态
当我们点击首选项的时候永远不会调用首选项的方法/函数
同样,当我们选择了某个选项,例如第三项,那么下次我们再次点击第三项,同样不会调用方法
本教程就是专门来解决此类问题,提供解决方案
2
Dropdown Extend —— 下来菜单扩展
以下脚本,是继承自 Dropdown 类的
也就是在 Dropdown 的基础上,对其内部函数进行了扩展
所以使用的时候,只需要创建一个下拉菜单UI元素,并移除其上的 Dropdown 组件
替换为 ChinarDropdown 脚本即可
using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;/// <summary>/// 将下拉菜单上的 Dropdown组件移除,替换为该脚本/// </summary>public class ChinarDropdown : Dropdown{ public bool AlwaysCallback = false;//是否开启 点击选项按钮总是回调 public void Show() { .Show(); Transform toggleRoot = transform.Find("Dropdown List/Viewport/Content"); Toggle[] toggleList = toggleRoot.GetComponentsInChildren<Toggle>(false); for (int i = 0; i < toggleList.Length; i++) { Toggle temp = toggleList[i]; temp.onValueChanged.RemoveAllListeners(); temp.isOn = false; temp.onValueChanged.AddListener(x => ItemEx(temp)); } } public override void OnPointerClick(PointerEventData eventData) { Show(); } public void ItemEx(Toggle toggle) { if (!toggle.isOn) { toggle.isOn = true; return; } int selectedIndex = -1; Transform tr = toggle.transform; Transform parent = tr.parent; for (int i = 0; i < parent.childCount; i++) { if (parent.GetChild(i) == tr) { selectedIndex = i - 1; break; } } if (selectedIndex < 0) return; if (value == selectedIndex && AlwaysCallback) onValueChanged.Invoke(value); else value = selectedIndex; Hide(); }}3
Dropdown Editor —— 使用编辑器扩展
细心的朋友已经注意到,2中的代码多了一个 AlwaysCallback 的布尔值变量
在层次面板中直接控制这个变量的对错,我们就需要一个编辑器类
进而控制下拉菜单是否开启函数,总是回调
如果不开启 / AlwaysCallback为:false;反之亦然!
using UnityEditor; //引用编辑器的脚本,需要放在 Editor 目录中using UnityEditor.UI;/// <summary>/// 此编辑器脚本:用于在层次面板中添加一个可控属性AlwaysCallback/// </summary>[CustomEditor(typeof(ChinarDropdown), true)][CanEditMultiple s]public class DropdownExEditor : DropdownEditor{ SerializedProperty AlwaysCallback; protected override void OnEnable() { .OnEnable(); AlwaysCallback = serialized .FindProperty("AlwaysCallback"); } public override void OnInspectorGUI() { .OnInspectorGUI(); EditorGUILayout.PropertyField(AlwaysCallback); serialized .ApplyModifiedProperties(); }}支持
May Be —— 搞开发,总有一天要做的事!
| 拥有自己的服务器,无需再找攻略! Chinar 提供一站式教程,闭眼式创建! 为新手节省宝贵时间,避免采坑! |
先点击领取 —— 阿里全产品优惠券 (享受最低优惠)
1 —— 云服务器超全购买流程 (新手必备!)
2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)
3—— Windows 服务器配置、运行、建站一条龙 !
4 —— Linux 服务器配置、运行、建站一条龙 !
技术交流群:806091680 ! Chinar 欢迎你的加入
END
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址>
继续阅读与本文标签相同的文章
-
这个团队10年牺牲1000人,马云远赴非洲为世界上最危险的职业颁奖
2026-05-27栏目: 教程
-
马老师:一个中国人为什么要保护大象?
2026-05-27栏目: 教程
-
.NET设计模式-单件模式(Singleton Pattern)
2026-05-27栏目: 教程
-
react+typescript实践总结
2026-05-27栏目: 教程
-
virtualBox创建共享文件夹
2026-05-27栏目: 教程
