一、Toggle

Is On :用来表示Toggle当前开关状态,勾选为开;
Graphic :控制Toggle组件开关图片的显示隐藏,默认选取Checkmark,就是那个勾勾图片;
1.OnValueChange在UI上添加侦听
public void ListenInFunction(bool isOn)
{
if (isOn)
{
Debug.Log("toggle ison");
}
else
{
Debug.Log("toggle isoff");
}
}
挂上这个脚本,会发现事件中有一个带参数的,还有一个不带参数的:

虽然ListenInFunction是带参数的,但是却要选上面那个绿色不带参数的,刚开始我是懵逼的…………
参照UGUI中Button和Toggle 添加动态事件得到了解释:
下方红线描出的为静态方法,功能类似上面讲述的为Button添加带参数回调事件一样,我们可以设定一个bool参数,这个参数不随Toggle的isOn变化。
而上方绿线标出的不带参数的OnValueChange则为系统自动生成的动态事件,Toggle的isOn已经被封装到参数之中。
选下方红色的静态方法,其实UI中会多出一个checkbox,可以指定传入的参数:

当然也可以传入其它类型,比如
public void ListenInFunctionArgs(int num)
{
Debug.Log("toggle args:" + num);
}

2.OnValueChange代码上添加侦听
public Toggle myToggle;
void Start()
{
myToggle.onValueChanged.AddListener(isOn => print(isOn ? "开" : "关"));
}
二、ToggleGroup
参考
Unity UGUI入门组件整理(三)【Toggle组件与Toggle Group组件】

public Toggle[] toggles;
void Start()
{
//myToggle.onValueChanged.AddListener(isOn => print(isOn ? "开" : "关"));
toggles = transform.GetComponentsInChildren<Toggle>();
for (int i = 0; i < toggles.Length; i++)
{
Toggle toggle = toggles[i];
toggle.onValueChanged.AddListener((bool value) => OnToggleClick(toggle, value));
}
}
public void OnToggleClick(Toggle toggle, bool isSwitch)
{
Debug.Log("toogle group name:" + toggle.name + isSwitch);
}
假如初始状态是Toggle3被勾选,当我点击Toggle1勾选时,打印如下:
toogle group name:toggle3False
toogle group name:toggle1True
这样就可以根据名字和选中状态来做逻辑处理了。
2.Allow Switch off
是否允许不打开任何开关?如果启用此设置,则按下当前打开的开关会将其关闭,因此没有任何开关处于打开状态。如果禁用此设置,则按下当前打开的开关将不改变该开关的状态。
这个说的有点绕,并且有些博客上还有种错误的说法,就是这个开关能允许Group多选。其实测试一下就知道了,在勾选Allow Switch off时,点击当前选中的Toggle,可以将当前Toggle改成未选择状态,此时整个Group中所有的Toggle都会处于未选择状态。而如果没勾选Allow Switch off,就达不到这个效果,会强迫你必须选一个。
在官方文档中,描述ToggleGroup叫开关组:
开关组不是可见的 UI 控件,而是一种修改一组开关的行为的方法。属于同一组的开关将受到约束,即一次只能打开其中一个开关:通过按下打开其中一个开关便会自动关闭其他开关。
当用户必须从互斥的一组选项进行选择时,便可使用开关组。常见示例包括选择玩家角色类型、速度设置(慢速、中速、快速等)、预设颜色和一周中的日期。在场景中可以同时有多个开关组对象,因此可以根据需要创建多个单独的组。
与其他 UI 元素不同,具有开关组 (Toggle Group) 组件的对象不必是画布对象的子项,但开关本身仍然是其子项。
3.ToggleGroup.ActiveToggles
UGUI学习笔记(五) ToggleGroup制作选择题单选框
IEnumerable<Toggle> answersGroup = ToggleGroup.ActiveToggles();
foreach (Toggle t in answersGroup)
{//遍历这个存放Toggle的按钮组IEnumerable,此乃C#的一个枚举集合,一般直接用foreach遍历
if (t.isOn)//遍历到一个被选择的Toggle
{
switch (t.name)//根据这个Toggle的name,我们给string sex赋予不同的值
{
case "Toggle0":
sex = "男";
break;
case "Toggle1":
sex = "女";
break;
}
break;//就没必要遍历下去了,后面已经可以预见到,都是没被选择的Toggle。
}
}
网友评论