关于UGUI里下拉框这组件,着实把我弄惨了,UI控件想要完全用按键的方式去操作情况太过于复杂。
关于dropdown下拉菜单
一般大伙的需求都是用鼠标去选择选项和拖动滚动条,但是对于各种需求而言,可能也会出现使用键盘操作的情况。坑爹的地方来了,dropdown生成下拉菜单的时候是将控件下的template重新实例化出来,相当于复制,更坑的是模版只有在点击选项的时候才会生成,选择了子选项后就会销毁。在实际的键盘操作中,想获取其滚动条可有点难受,一不注意就会报空指针,所以我们得按需获取组件。
关于eventSystem
既然是按键控制,所以我们得先获取当前按键走到了什么位置,在由此判断滚动条是否应该跟随滚动。滚动条主要适用于下拉选单的选项很多的时候。
参考解决方案
首先我们需要判断何时获取控制滚动条,运行的时候,未点击按钮时,不能去获取,否则会空指针异常。也就是,当dropdown执行show()的时候去获取。这里我直接用if判断了。注意,首先确定dropdown会生成什么样的组件名。
private ScrollRect scrollRect;
private Dropdown dropdown;
if (dropdown.transform.Find("Dropdown List"))
{
scrollRect = dropdown.transform.Find("Dropdown List").GetComponent<ScrollRect>();
}
之后我们通过eventSystem事件去判断当前按键走到哪个组件。这块大伙可以先参考Unity的导航选项Navigation。
private EventSystem eventSystem;
void Start()
{
eventSystem = GetComponent<EventSystem>();
}
// 下面的在update里每帧检测
// currentSelectedGameObject获取当前按键所在的物体
// 确定在什么位置时需要滚动条跟随
if (eventSystem.currentSelectedGameObject.transform.position.y < 124.8f)
{
if (Input.GetKeyDown(KeyCode.S))
{
// 获取模版的scrollRect就能直接操作滚动条了
// 水平还是垂直看个人,建议查阅api
scrollRect.verticalNormalizedPosition -= 0.3f;
if (scrollRect.verticalNormalizedPosition < 0.2f)
{
scrollRect.verticalNormalizedPosition = 0;
}
}
}
通过这种方式,能够很简单的控制滚动条,实际使用中,建议将坐标等位置创建空物体去获取,而不是写死坐标值。仅供大伙参考参考…