天天看点

Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序

1. 常见问题:如果发现这个tab键按下时,跳转2个输入框,在project中,右键此脚本,选择Find References In Scene,肯定某一时刻同时有两个gameobject绑定了此脚本。

效果图如下:

要实现,选完“分类”下拉框内容后,按一下tab键,光标直接跳转单位名称一栏,

按到最下方“联系电话”一栏后,在从“分类”栏进行循环;按住左(或者右)shift,在按下tab键,光标进行向上跳转!

Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序

第一步:设置这些UI控件的navigation属性,原来的Automatic改成Explicit,如图:

Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序

第二步:进行如下设置

Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序

第三步:这些UI控件,选其一绑定如下脚本

Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
/// <summary>
///2017年3月31日10:30:19
/// 阿祥 unity 5.3.6
///Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 panel下 Dropdown和inputfield等控件的控制顺序
/// </summary>
public class InputNavigator : MonoBehaviour, ISelectHandler, IDeselectHandler
{
    EventSystem system;
    private bool _isSelect = false;
    private bool isGetOneMessage=false;

    void Start()
    {
        system = EventSystem.current;
    }

    void Update()
    {
        #region
        //监测Tab按下,此时应该选择下一个UI控件
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            Selectable next = null;//下一个ui控件
            Selectable current = null;//当前的ui控件
            //验证当前是否有正在选中的物体
            if (system.currentSelectedGameObject != null)
            {   //验证当前选中的物体在层次列表里是否可用
                if (system.currentSelectedGameObject.activeInHierarchy)
                {
                    current = system.currentSelectedGameObject.GetComponent<Selectable>();
                }
            }
            if (current != null)
            {
                //当左(右)shift被按住,并且伴随着,点击tab键,光标依次向上移动
                if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
                {
                    next = current.FindSelectableOnUp();
                    if (next == null)
                    {
                        next = current.FindSelectableOnLeft();
                    }
                }
                else
                {
                    next = current.FindSelectableOnDown();
                    if (next == null)
                    {
                        next = current.FindSelectableOnRight();
                    }
                }
            }
            else
            {
                //如果没有 “当前正在选择的物体”,那么选择第一个可选项
                if (Selectable.allSelectables.Count > )
                {
                    next = Selectable.allSelectables[];
                }
            }

            if (next != null)
            {
                next.Select();
            }
        }
        #endregion
    }

    public void OnSelect(BaseEventData eventData)
    {
        _isSelect = true;
    }

    public void OnDeselect(BaseEventData eventData)
    {
        _isSelect = false;
    }
}
           

over!

继续阅读