Unity3D开发之遇上Dropdown

来源:互联网 发布:软件研发部 考核指标 编辑:程序博客网 时间:2024/05/28 18:44

unity应该是在5.0版本更新了新的UI组件,Dropdown。以前实现这个功能都需要自己来组装。现在集成化确实对开发者来说更快更方便。下面说下我在开发中遇到的跟Dropdown相关的问题。

unity的UGUI组件功能绑定更偏向于界面话,我们可以在编辑器中将函数绑定到组件中。但是当我们将canvas做成预制体之后,每次更新Canvas后,Canvas下的组件绑定的函数都会自动丢失。如果我们项目中很多场景共用一个Canvas,我们还需要一个个手动绑定函数,确实太糟心了。我们就可以使用程序来自动绑定。Button的和Dropdown的OnvalueChange函数绑定代码如下:

_DataWindow.Find("Button").GetComponent<Button>().onClick.AddListener(OnDataListButtonClick);        SceneNameDropdown.onValueChanged.AddListener(x=> OnValueChange());
这样我们就不需要去担忧函数的绑定丢失了。

项目中,我们还有一个如果Dropdown中的选择项是变化的,我们就需要根据程序来动态添加。

//重置Dropdown 根据脚本更新Dropdown        SceneNameDropdown.ClearOptions();        for (int i = 0; i < Globle.SceneChineseNameList.Count; i++)        {            Dropdown.OptionData op = new Dropdown.OptionData();            op.text = Globle.SceneChineseNameList[i];            SceneNameDropdown.options.Add(op);        }


还有,当有很多选择项时,比如几百个,我们不可能一个个去找,这时候我们需要做搜索功能。下面我说下搜索到后我们怎么在Dropdown下来菜单中显示搜索到的选择项。

在搜索函数中,我们通常会获取到一个返回值,即是该搜索对象在所有选项储存列表中的索引位置。即Index值。

private void OnSearch()    {        string _sceneName = sceneNameInput.text.Trim();        int _index= Globle.SceneChineseNameList.FindIndex(x=>x==_sceneName);_count = Globle.SceneChineseNameList.Count;print (_index);if (_index < 0)return;SceneNameDropdown.Show();Transform _DropdownList = SceneNameDropdown.transform.Find ("Dropdown List");if (!_DropdownList)return;Transform _content = _DropdownList.GetChild (0).GetChild (0);if(_index>7){float _y = _content.localPosition.y;if (_count - _index >= 6) _content.DOLocalMoveY (_y + 20 * _index, 0.1f);else  _content.DOLocalMoveY (_y + 20 * (_index - 6), 0.1f);}_content.GetChild (_index+1).GetComponent<Selectable> ().Select ();    }

这里的6不是固定的,我们要根据一个下拉列表能显示几个选项为准。还有20是每个元素在的宽度。这些都是要我们在实际项目中自己调试。

以上就是我在UI开发中遇到和Dropdown相关的问题。如果能帮助到你,很荣幸!


原创粉丝点击