Unity3D 重写下拉菜单/Dropdown组件、开启每个按钮可用

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ChinarCSDN/article/details/80233602

Chinar blog www.chinar.xin

Unity UGUI 完整系列教程 (Chinar中文图解)

重写 Dropdown 扩展


本文提供全流程,中文翻译

Chinar 的初衷是将一种简单的生活方式带给世人

使有限时间 具备无限可能

Chinar —— 心分享、心创新!

开启下拉菜单/ Dropdown 每次点击都可用

为初学者节省宝贵的时间,避免采坑!

Chinar 教程效果:



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Description —— 说明


Unity3D UGUI下拉菜单/Dropdown组件用法、总结

接上个教程对 Dropdown进行扩展

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()
    {
        base.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 => OnSelectItemEx(temp));
        }
    }


    public override void OnPointerClick(PointerEventData eventData)
    {
        Show();
    }


    public void OnSelectItemEx(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 的布尔值变量

Chinar 写了一个编辑器类,在 Inspector 面板中直接控制这个 bool 变量,便于管理维护

进而控制下拉菜单是否开启函数,总是回调

如果不开启 / AlwaysCallback 为:false ;反之亦然!

该脚本放于 Editor 目录下,没有请自己创建一个

举个例子

using UnityEditor; //引用编辑器的脚本,需要放在 Editor 目录中
using UnityEditor.UI;


/// <summary>
/// 此编辑器脚本:用于在层次面板中添加一个可控属性AlwaysCallback
/// </summary>
[CustomEditor(typeof(ChinarDropdown), true)]
[CanEditMultipleObjects]
public class DropdownExEditor : DropdownEditor
{
    SerializedProperty AlwaysCallback;


    protected override void OnEnable()
    {
        base.OnEnable();
        AlwaysCallback = serializedObject.FindProperty("AlwaysCallback");
    }


    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        EditorGUILayout.PropertyField(AlwaysCallback);
        serializedObject.ApplyModifiedProperties();
    }
}

去掉 Dropdown 组件,改为ChinarDropdown

这里写图片描述

Unity UGUI 完整系列教程 (Chinar中文图解)


支持

May Be —— 开发者,总有一天要做的事!


拥有自己的服务器,无需再找攻略

Chinar 提供一站式《零》基础教程

使有限时间 具备无限可能!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


Chinar 免费服务器、建站教程全攻略!( Chinar Blog )


Chinar

END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

展开阅读全文

没有更多推荐了,返回首页