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

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

效果图如下:
要实现,选完“分类”下拉框内容后,按一下tab键,光标直接跳转单位名称一栏,
按到最下方“联系电话”一栏后,在从“分类”栏进行循环;按住左(或者右)shift,在按下tab键,光标进行向上跳转!
这里写图片描述
第一步:设置这些UI控件的navigation属性,原来的Automatic改成Explicit,如图:
原来的Automatic改成Explicit
第二步:进行如下设置
这里写图片描述
第三步:这些UI控件,选其一绑定如下脚本
这里写图片描述

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 > 0)
                {
                    next = Selectable.allSelectables[0];
                }
            }

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

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

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

over!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyDog阿祥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值