自己的老帖子,移植过来
原地址:
http://www.manew.com/home.php?mod=space&uid=95681&do=blog&view=me&from=space
热度 7 2364 2015-11-23 20:24 |个人分类:UGUI| Unity, Dropdown
对于Unity 5.1 之前UGUI一直没有自带下拉列表这一点,楼主表示很蛋疼,插件什么的用着也不舒服,总感觉不如系统自带的好,前一段时间5.2.2更新,终于出了下拉列表,但楼主表示它用起来并没有那么简单,就最基本的获取当前选择项的文本来说,就不是一句“.value”能搞定的,那么下面我就先说下,如何获取当前选择的年文本,
废话少说,先上代码(其实也就一句话)
public Dropdown dropdown;
public Text text;
public void OnValueChanged() {
text.text = dropdown.options[dropdown.value].text;
}
下面我简单说下为什么这样写,
这句dropdown.value可以获取当前选择项的序号,从第一项开始是0,1,2...
而dropdown.options是一个数组,
摘要:
// The list of possible options. A text string and an image can be specified
// for each option.
上面摘要是API里对它的解释,本人理解它就是保存所有所有下拉列表选项的一个数组。
那么接下来dropdown.options[dropdown.value]就可以获取数组里当前选择的那一项,它是OptionData类型的,访问其text属性就可以得到文本了。
运行结果,更改下拉框,右侧文本会随着改变。
允许我发泄下,刚刚写好的更新内容,因为验证码写错全木有了,容我哭会再回来重写。。。。
好了,哭完了,,今天说下用代码增加下拉按钮的内容吧
刚刚研究了很久,发现dropdown这个后来的控件真的很坑啊。。。找了一上午资料得到了如下结论:
dropdown(下拉按钮),想要动态控制它,我发现直接给它字符串不行,那么就要新建optionitem,之后我新建可optionitem发现不能把它加在dropdown的add方法中,因为无法为该item赋值,好,那我再找别的方法,我查Unity的API(一个Unity的官方文档,查看所有程序接口的),发现dropdown有方法“CreateItem”,那我现在要用它却发现它是,protect的(这代表,不允许随意使用),好我又找怎么访问protect的方法,百度告诉我,它的子类和友元函数可以实现访问,好!子类是肯定不是了,那么友元函数呢,我查了下,百度告诉我c#没有友元函数,,,我表示,,,
好吧,不管它了,吃了顿饭回来我突然发现了这个,,,
我去,该换眼镜了我,,,呵呵。好了不废话了,下面上代码(还是就两句话)
public Dropdown dropdown;
List inside=new List{"sdadsa","123daq","点卡和万科","!@^&@#","adw&^h科技"};
void Start() {
dropdown.AddOptions(inside);
}
运行结果一定是你们想要的啦。。。
下面简单说下这个AddOption方法,它有三个重载,分别是可以传入的不同参数,(但都是泛型数组List)
第一种是string类型的list,就是我用的,不用多说啦
第二种是sprite类型的,第三种是dropdown.option类型的,
好啦,我在发现什么坑再来填吧,,,
回来看看,顺便补几句如何设置DropDown的UI部分吧
1.控件外观直接给个图片或颜色即可,直接拖拽就可以改变尺寸
2.对于下拉出来的内容,若调节每个子项的背景,在Template下最底层,Item Background给颜色或背景图即可
3.下拉出来内容的背景颜色,更改Template上的Image的背景图或颜色即可(即补上下的白边)
4.改变下拉内容子项的尺寸
直接更改Template下Item(以及其内容)的尺寸即可,
PS:这次没配图,亲自试一下便知
===20200414===
想要实现一个类似按钮Invoke的那种,调用按钮OnClick的Invoke,就会模拟点击按钮的需求,
要用代码调用Dropdown并改变状态,而且会通知其绑定的OnValueChange事件。
非常简单,
直接dropdown.value=某int值即可。它会根据你给的值,调用已经绑定的OnValueChange事件
dp.value = 2;
若只想修改值,而不需要调用OnValueChange事件,需要调用如下方法
if (Input.GetKeyDown(KeyCode.Space)) {
dp.SetValueWithoutNotify(2);
}