复写Unity中UGUI的Dropdown

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u014732824/article/details/101454210
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;


/// <summary>
/// 将下拉菜单上的 Dropdown组件移除,替换为该脚本
/// </summary>
public class DropdownPro : Dropdown
{
    public bool AlwaysCallback = false;//是否开启 点击选项按钮总是回调

    public Image arrow;
    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));
        }
        arrow.sprite = AtlasMgr.GetSprite("MapSelecting_3");
    }
    public void Hide()
    {
        base.Hide();
        arrow.sprite = AtlasMgr.GetSprite("MapSelecting_2");
    }
    protected override void DestroyBlocker(GameObject blocker)
    {
        base.DestroyBlocker(blocker);
        arrow.sprite = AtlasMgr.GetSprite("MapSelecting_2");
    }
    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();
    }
}
using UnityEditor; //引用编辑器的脚本,需要放在 Editor 目录中
using UnityEditor.UI;


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

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


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

猜你喜欢

转载自blog.csdn.net/u014732824/article/details/101454210
今日推荐