最近工作太忙了 没有时间学习 也没时间更博
不过昨天马三小伙儿问了我一个他们公司的需求 帮他想了一下思路 顺便作为一个脚本发个帖吧
顺便祝贺我转正成功
需求:
左侧勾选区域逻辑优化
a. 勾选全部后,所有选项添加勾选状态
b. 勾选全部后,手动去掉任意颜色的勾选(除全部外),全部勾选同时去掉
c. 全部勾选状态下,再次点击全部,取消所有勾选状态
d. 所有颜色的勾选都选中后,自动将将全部选项也勾选上
这个需求其实在真正项目中挺常见的emmmmm 不过就是逻辑上比较烦
实现:
用的原生接口 可以直接复制使用
Prefab很简单 只是一个总开关和子开关 因为可以多选 所以没有ToggleGroup
以及一个脚本 因为只是做简单的例子 所以数量什么的都写死了
代码:
变量部分
[Header("总开关")]
public Toggle allToggle;
[Header("子开关列表")]
public List<Toggle> singleToggleList;
//当前toggle状态
private EToggleState state = EToggleState.None;
//当前开启singleToggle数量
private int singlToggleOnNum = 0;
//toggle状态
private enum EToggleState
{
None = 0, //全关
All = 1, //全开
Some = 2, //部分开启
}
逻辑部分
void Start()
{
//监听总开关
allToggle.onValueChanged.AddListener((bool value) =>
{
if (value == true)
{
state = EToggleState.All;
AllSingleToggleOn(value);
}
else
{
//只有全部打开时才能全部关掉 这样关闭一个子开关不会影响总开关整体逻辑
if (state == EToggleState.All)
{
state = EToggleState.None;
AllSingleToggleOn(value);
}
}
});
//监听子开关
foreach (Toggle singleToggle in singleToggleList)
{
singleToggle.onValueChanged.AddListener((bool value) =>
{
//先做子开关的逻辑
state = EToggleState.Some;
if (value == true)
{
singlToggleOnNum++;
//所有都打开时 开启总开关
if (singlToggleOnNum == singleToggleList.Count)
{
state = EToggleState.All;
allToggle.isOn = true;
}
}
else
{
//有子开关关闭 就一并关闭总开关
singlToggleOnNum--;
allToggle.isOn = false;
//全部关闭时改变状态
if (singlToggleOnNum == 0)
{
state = EToggleState.None;
}
}
//这里可以做子开关开启或关闭的逻辑处理
string name = singleToggle.gameObject.name;
Debug.Log("State of <color=#AAFF00>" + name + "</color> is <color=#AAFF00>" + value + "</color>");
});
}
}
//开启或关闭全部子开关
private void AllSingleToggleOn(bool state)
{
foreach(Toggle singleToggle in singleToggleList)
{
singleToggle.isOn = state;
}
}
顺便推一下马三小伙儿 说不定这里有你想要的
https://www.cnblogs.com/msxh/
https://github.com/XINCGer