12.UGUI基础-组合控件-Toggle开关控件
12.1 知识点
Toggle是什么
Toggle是开关组件,是UGUI中用于处理玩家单选框多选框相关交互的关键组件。

默认创建的Toggle由4个对象组成:
- 父对象——Toggle组件依附。
- 子对象——背景图(必备)、选中图(必备)、说明文字(可选)。
Toggle开关组件参数


Interactable 时候交互
- 是否接受输入。
Transition 过渡

- 响应用户输入的过渡效果。
Navigation 导航
- 导航模式,可以设置UI元素如何在播放模式中控制器导航。
IsOn 是开启的
- 当前是否处于打开状态。
Toggle Transition 切换过渡

- 在开关值变化时的过渡方式。
None:无任何过渡,直接显示隐藏。
Fade:淡入淡出。
Graphic 图形

- 用于表示选中状态的图片,默认关联一个勾形状的创建Toggle自动创建的选中图对象。
Group 组

- 关联的ToggleGround单选框分组组件。
- 要变成单选框的基本套路是创建一个空物体,添加ToggleGroup组件,作为管理单选框的组对象。一般把所有管理Toggle放在ToggleGroup下。然后再每个Toggle的Ground关联ToggleGroup对象。实现单选框。  
- Allow Switch Off:是否允许不选中任何一个单选框,就是可能出现一个单选框组一个都不选。注意:单选框分组组件可以挂载在任何对象上,只需要将其和一组的单选框关联即可。
OnValueChanged 值改变时
- 开关状态变化时执行的函数列表。
Toggle开关代码控制
GetComponent<Toggle>() 得到Toggle组件
// 获取 Toggle 组件的引用赋值给 toggle 变量
Toggle toggle = this.GetComponent<Toggle>();
Toggle.isOn变量 设置状态为打开
// 设置 toggle 的状态为打开
toggle.isOn = true;
// 打印 toggle 的状态
print(toggle.isOn);
GetComponent<ToggleGroup>() 获取ToggleGroup组件
// 获取 ToggleGroup 组件的引用赋值给 toggleGroup 变量
ToggleGroup toggleGroup = this.GetComponent<ToggleGroup>();
ToggleGroup.allowSwitchOff属性 是否允许单选框一个都不选
// 设置 toggleGroup 的 allowSwitchOff 属性为 false,禁止取消选中所有 Toggle
toggleGroup.allowSwitchOff = false;
toggleGroup.ActiveToggles方法 得到ToggleGroup中选中状态的Toggle
// 使用 foreach 循环遍历 ToggleGroup 中目前处于选中状态的 Toggle
foreach (Toggle item in toggleGroup.ActiveToggles())
{
    // 打印每个选中的 Toggle 的名称和状态(isOn)
    print(item.name + " " + item.isOn);
}
Toggle监听事件的两种方式
添加的监听事件要有一个布尔值参数。
拖脚本添加事件监听

点击Button组件下OnClick下面的添加按钮,可以选择关联对象,在选择关联对象上哪个脚本的哪个事件,进行点击事件的监听。只能关联公共的方法。可以关联多个函数。
public void ChangValue(bool isOn)
{
    print("状态改变" + isOn);
}    
代码添加事件监听
toggle.onValueChanged.AddListener 添加值改变事件监听
private void ChangeValue2(bool v)
{
    print("代码监听 状态改变" + v);
}  
// 监听 toggle 的值改变事件,当值改变时调用 ChangeValue2 方法
toggle.onValueChanged.AddListener(ChangeValue2);
// 使用 lambda 表达式定义一个匿名方法并监听 toggle 的值改变事件
toggle.onValueChanged.AddListener((b) =>
{
    // 在控制台打印输出字符串,显示状态改变信息和当前状态值 b
    print("代码监听lambda表达式 状态改变" + b);
});
12.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Lesson12_UGUI基础_组合控件_Toggle开关控件 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 Toggle是什么
        //Toggle是开关组件
        //是UGUI中用于处理玩家单选框多选框相关交互的关键组件
        //开关组件 默认是多选框
        //可以通过配合ToggleGroup组件制作为单选框
        //默认创建的Toggle由4个对象组成
        //父对象——Toggle组件依附
        //子对象——背景图(必备)、选中图(必备)、说明文字(可选)
        #endregion
        #region 知识点二 Toggle参数相关
        #endregion
        #region 知识点三 Toggle代码控制
        // 获取 Toggle 组件的引用赋值给 toggle 变量
        Toggle toggle = this.GetComponent<Toggle>();
        // 设置 toggle 的状态为打开
        toggle.isOn = true;
        // 打印 toggle 的状态
        print(toggle.isOn);
        // 获取 ToggleGroup 组件的引用赋值给 toggleGroup 变量
        ToggleGroup toggleGroup = this.GetComponent<ToggleGroup>();
        // 设置 toggleGroup 的 allowSwitchOff 属性为 false,禁止取消选中所有 Toggle
        toggleGroup.allowSwitchOff = false;
        // 使用 foreach 循环遍历 ToggleGroup 中目前处于选中状态的 Toggle
        foreach (Toggle item in toggleGroup.ActiveToggles())
        {
            // 打印每个选中的 Toggle 的名称和状态(isOn)
            print(item.name + " " + item.isOn);
        }
        #endregion
        #region 知识点四 Toggle监听事件的两种方式
        //1.拖脚本
        //2.代码添加
        // 监听 toggle 的值改变事件,当值改变时调用 ChangeValue2 方法
        toggle.onValueChanged.AddListener(ChangeValue2);
        // 使用 lambda 表达式定义一个匿名方法并监听 toggle 的值改变事件
        toggle.onValueChanged.AddListener((b) =>
        {
            // 在控制台打印输出字符串,显示状态改变信息和当前状态值 b
            print("代码监听lambda表达式 状态改变" + b);
        });
        #endregion
    }
    public void ChangValue(bool isOn)
    {
        print("状态改变" + isOn);
    }    
    private void ChangeValue2(bool v)
    {
        print("代码监听 状态改变" + v);
    }
}
12.3 练习题
在上节课的练习题基础上,请用现在所学知识,制作一个这样的功能:场景上对象发射子弹有音效,通过用UGUI的Toggle开关 控制音效开关
在PlayerObject脚本声明了一个公共 AudioClip 类型的变量 ac,用于存储音频剪辑。在外部拖拽关联
// 声明一个名为 ac 的公共 AudioClip 类型变量
public AudioClip ac;

在PlayerObject脚本的开火方法中,添加每次开火前添加 AudioSource 组件并播放音频剪辑,设置音频播放结束后自动销毁 AudioSource 组件的延迟时间为 0.8 秒
// 在游戏对象上添加 AudioSource 组件并播放音频剪辑
AudioSource audioSource = this.gameObject.AddComponent<AudioSource>();
audioSource.clip = ac;
audioSource.Play();
// 设置音频播放结束后自动销毁 AudioSource 组件的延迟时间为 0.8 秒
Destroy(audioSource, 0.8f);
创建Toggle组,子对象包含一个Text和两个Toggle分别代表开和关。让开关Toggle和Toggle组进行关联。

创建MusicData脚本,用于控制音乐数据。添加一个静态变量,代表音效是否开启。
public class MusicData
{
    //音效是否开启
    public static bool SoundIsOpen = true;
}
添加Toggle开和关和ToggleGroup变量。在外面关联。创建当音效开关的 Toggle 值发生改变时调用的方法。根据获取当前被激活的 Toggle对象设置MusicData中音效是否开启的布尔值。
// 音效开关
public Toggle togOn;
public Toggle togOff;
public ToggleGroup tg;
// 在游戏面板初始化时调用的方法
void Start()
{
    // 给音效开关的两个 Toggle 添加值改变监听器
    togOn.onValueChanged.AddListener(TogChangeValue);
    togOff.onValueChanged.AddListener(TogChangeValue);
}
// 当音效开关的 Toggle 值发生改变时调用的方法
private void TogChangeValue(bool v)
{
    // 获取当前被激活的 Toggle
    foreach (Toggle item in tg.ActiveToggles())
    {
        // 如果被激活的 Toggle 是 togOn
        if (item == togOn)
        {
            // 将音效开关设置为打开
            MusicData.SoundIsOpen = true;
        }
        // 如果被激活的 Toggle 是 togOff
        else if (item == togOff)
        {
            // 将音效开关设置为关闭
            MusicData.SoundIsOpen = false;
        }
    }
}
在PlayerObject脚本的开火方法中添加音效开关是否打开的判断,根据判断结果决定是否播放音效。
// 如果音效开关打开
if (MusicData.SoundIsOpen)
{
    // 在游戏对象上添加 AudioSource 组件并播放音频剪辑
    AudioSource audioSource = this.gameObject.AddComponent<AudioSource>();
    audioSource.clip = ac;
    audioSource.Play();
    // 设置音频播放结束后自动销毁 AudioSource 组件的延迟时间为 0.8 秒
    Destroy(audioSource, 0.8f);
}
12.4 练习题代码
MusicData
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MusicData
{
    //音效是否开启
    public static bool SoundIsOpen = true;
}
GamePanel
// 引用命名空间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
// 游戏面板类,继承 MonoBehaviour 类
public class GamePanel : MonoBehaviour
{
    // 声明一个名为 btnAtk 的按钮变量
    public Button btnAtk;
    // 音效开关
    public Toggle togOn;
    public Toggle togOff;
    public ToggleGroup tg;
    // 玩家对象
    public PlayerObject player;
    // 在游戏面板初始化时调用的方法
    void Start()
    {
        // 给攻击按钮添加点击事件监听器
        btnAtk.onClick.AddListener(() =>
        {
            // 获取玩家对象并执行开火方法
            player.Fire();
        });
        // 给音效开关的两个 Toggle 添加值改变监听器
        togOn.onValueChanged.AddListener(TogChangeValue);
        togOff.onValueChanged.AddListener(TogChangeValue);
    }
    // 当音效开关的 Toggle 值发生改变时调用的方法
    private void TogChangeValue(bool v)
    {
        // 获取当前被激活的 Toggle
        foreach (Toggle item in tg.ActiveToggles())
        {
            // 如果被激活的 Toggle 是 togOn
            if (item == togOn)
            {
                // 将音效开关设置为打开
                MusicData.SoundIsOpen = true;
            }
            // 如果被激活的 Toggle 是 togOff
            else if (item == togOff)
            {
                // 将音效开关设置为关闭
                MusicData.SoundIsOpen = false;
            }
        }
    }
}
PlayerObject
// 引用命名空间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 声明一个名为 PlayerObject 的类,并继承 MonoBehaviour 类
public class PlayerObject : MonoBehaviour
{
    // 声明一个名为 ac 的公共 AudioClip 类型变量
    public AudioClip ac;
    /// <summary>
    /// 开火方法
    /// </summary>
    public void Fire()
    {
        // 如果音效开关打开
        if (MusicData.SoundIsOpen)
        {
            // 在游戏对象上添加 AudioSource 组件并播放音频剪辑
            AudioSource audioSource = this.gameObject.AddComponent<AudioSource>();
            audioSource.clip = ac;
            audioSource.Play();
            // 设置音频播放结束后自动销毁 AudioSource 组件的延迟时间为 0.8 秒
            Destroy(audioSource, 0.8f);
        }
        // 动态创建子弹对象,通过加载 Resources 文件夹中的 "Bullet" 预制体来实例化子弹对象
        Instantiate(Resources.Load<GameObject>("Bullet"), this.transform.position, this.transform.rotation);
    }
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com
 
            