12.Toggle开关

  1. 12.UGUI基础-组合控件-Toggle开关控件
    1. 12.1 知识点
      1. Toggle是什么
      2. Toggle开关组件参数
        1. Interactable 时候交互
        2. Transition 过渡
        3. Navigation 导航
        4. IsOn 是开启的
        5. Toggle Transition 切换过渡
          1. None:无任何过渡,直接显示隐藏。
          2. Fade:淡入淡出。
        6. Graphic 图形
        7. Group 组
        8. OnValueChanged 值改变时
      3. Toggle开关代码控制
        1. GetComponent<Toggle>() 得到Toggle组件
        2. Toggle.isOn变量 设置状态为打开
        3. GetComponent<ToggleGroup>() 获取ToggleGroup组件
        4. ToggleGroup.allowSwitchOff属性 是否允许单选框一个都不选
        5. toggleGroup.ActiveToggles方法 得到ToggleGroup中选中状态的Toggle
      4. Toggle监听事件的两种方式
        1. 拖脚本添加事件监听
        2. 代码添加事件监听
          1. toggle.onValueChanged.AddListener 添加值改变事件监听
    2. 12.2 知识点代码
    3. 12.3 练习题
      1. 在上节课的练习题基础上,请用现在所学知识,制作一个这样的功能:场景上对象发射子弹有音效,通过用UGUI的Toggle开关 控制音效开关
        1. 在PlayerObject脚本声明了一个公共 AudioClip 类型的变量 ac,用于存储音频剪辑。在外部拖拽关联
        2. 在PlayerObject脚本的开火方法中,添加每次开火前添加 AudioSource 组件并播放音频剪辑,设置音频播放结束后自动销毁 AudioSource 组件的延迟时间为 0.8 秒
        3. 创建Toggle组,子对象包含一个Text和两个Toggle分别代表开和关。让开关Toggle和Toggle组进行关联。
        4. 创建MusicData脚本,用于控制音乐数据。添加一个静态变量,代表音效是否开启。
        5. 添加Toggle开和关和ToggleGroup变量。在外面关联。创建当音效开关的 Toggle 值发生改变时调用的方法。根据获取当前被激活的 Toggle对象设置MusicData中音效是否开启的布尔值。
        6. 在PlayerObject脚本的开火方法中添加音效开关是否打开的判断,根据判断结果决定是否播放音效。
    4. 12.4 练习题代码
      1. MusicData
      2. GamePanel
      3. PlayerObject

12.UGUI基础-组合控件-Toggle开关控件


12.1 知识点

Toggle是什么

Toggle是开关组件,是UGUI中用于处理玩家单选框多选框相关交互的关键组件。

默认创建的Toggle由4个对象组成:

  • 父对象——Toggle组件依附。
  • 子对象——背景图(必备)、选中图(必备)、说明文字(可选)。

Toggle开关组件参数


Interactable 时候交互

  • 是否接受输入。

Transition 过渡

  • 响应用户输入的过渡效果。
  • 导航模式,可以设置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

×

喜欢就点赞,疼爱就打赏