Unity游戏开发经验分享unityUnity技术分享

游戏中的单选、多选(全选)是如何实现的

2019-08-12  本文已影响10人  能不写代码么

前言

单选功能的实现

1、首先创建三个Toggle挂载在GameObject父物体下 2、然后为父物体GameObject添加组件ToogleGroup,并且将三个子物体toogle组件中的Group设置为父物体 3、取消勾选其中两个toogle子物体的isOn(默认勾选),这样就实现了单选,看下效果

多选以及全选功能的实现

1、首先创建四个toogle,将第一个toogle的Label改为总开关便于区分

2、接下来我们不再使用toogleGroup组件,因为默认组件无法实现这个功能,需要一些简单的代码就可以搞定这个事情

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ToggleTotal : MonoBehaviour
{
    public enum ToggleState
    {
        All, //全部打开
        PART,//部分开启
        None,//全部关闭
    }

    public Toggle toggleTotal;//总开关

    public Toggle[] toggleList;//子开关

    private ToggleState toggleState = ToggleState.PART; //当前开关的状态

    // Start is called before the first frame update
    void Start()
    {
        //当前被打开的开关数量
        int toggleIsOnNumer = 0;

        //总开关的开关逻辑
        toggleTotal.onValueChanged.AddListener((bool isOn) =>
            {
                if (isOn)
                {
                    //开启总开关,则全部子开关默认打开
                    toggleState = ToggleState.All;
                    AllToggleState(isOn);
                }
                else
                {
                    //关闭总开关,则全部子开关关闭,但触发前提是总开关打开的情况下(因为有总开关关闭,子开关部分开启的时候,这个时候初始化会执行一次这里,就不能让子开关全部关闭)
                    if(toggleState == ToggleState.All)
                    {
                        toggleState = ToggleState.None;
                        AllToggleState(isOn);
                    }                    
                }
            }
        );

        //子开关的开关逻辑
        foreach (Toggle toggles in toggleList)
        {
            toggles.onValueChanged.AddListener((bool isOn) =>
                {
                    //子开关有变化就先设置状态为 部分打开
                    toggleState = ToggleState.PART;

                    if (isOn)
                    {
                        //有开关打开,被打开的开关数量加一,如果子开关全部开启,那么启动总开关
                        toggleIsOnNumer += 1;

                        if (toggleIsOnNumer == toggleList.Length)
                        {
                            toggleState = ToggleState.All;
                            toggleTotal.isOn = true;
                        }
                    }
                    else
                    {
                        //有开关关闭,被打开的开关数量减一,总开关会关闭,如果子开关全部关闭,设置开关状态
                        toggleIsOnNumer -= 1;
                        toggleTotal.isOn = false;

                        if (toggleIsOnNumer == 0)
                        {
                            toggleState = ToggleState.None;                           
                        }
                    }
                    //TODO 正式项目中必须将toggleIsOnNumer进行本地存储
                }
            );
        }
    }

    /// <summary>
    /// 所有开关都打开或者都关闭
    /// </summary>
    public void AllToggleState(bool isOn)
    {
        foreach (Toggle toggles in toggleList)
        {
            toggles.isOn = isOn;
        }
    }

}

是不是感觉很简单讷,注释很全的哦!
注意:正式项目中必须将toggleIsOnNumer进行本地存储

3、看下效果吧

结语

本文用一个脚本和四个开关组件实现了对应的功能,内容偏基础一些,算是对自己的学习一点积累,大家有疑问也可以私信交流哦,感谢观看

搜索词缀

Unity单选、Unity多选、Unity全选、Unity的Toggle组件

上一篇 下一篇

猜你喜欢

热点阅读