版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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();
}
}