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