14.Slider滑动条

14.UGUI基础-组合控件-Slider滑动条控件


14.1 知识点

Slider是什么

Slider是滑动条组件,是UGUI中用于处理滑动条相关交互的关键组件。

默认创建的Slider由4组对象组成,父对象——Slider组件依附的对象,子对象——背景图、进度图、滑动块三组对象。

Slider滑动条组件参数


FillRect 填充矩形

  • 关联的用于填充的进度条图形对象。

Handle Rect 处理矩形

  • 关联的用于滑动的滑动块图形对象。

Direction 方向

  • 滑动条值增加的方向:
    • Left To Right:从左到右
    • Right To Left:从右到左
    • Bottom To Top:从下到上
    • Top To Bottom:从上到下

Min Value 和 Max Value

  • 最小值和最大值,滑动滚动条时值从最小到最大之间变化(左右、上下极值)。

Whole Numbers 整数

  • 是否约束为整数值变化。

Value

  • 当前滑动条代表的数值。

OnValueChanged 值改变时

  • 滑动条值改变时执行的函数列表。

Slider滑动条代码控制

GetComponent<Slider>() 得到Slider组件

// 声明一个 Slider 变量 slider,用于存储该组件的引用
Slider slider = this.GetComponent<Slider>();

Slider.value变量 slider的当前值

// 打印出 slider 的当前值
print(slider.value);

Slider监听事件的两种方式

拖脚本监听事件


关联的函数要有一个float类型的参数,要选择动态的函数。

public void ChangeValue(float v)
{
    print(v);
}

假如选择静态会值改变时会只打印右边输入框的值。

代码添加监听事件

Slider.onValueChanged.AddListener 添加值改变事件监听
// 给 Slider 组件的 onValueChanged 事件添加一个监听器,该监听器为 ChangeValue 方法
slider.onValueChanged.AddListener(ChangeValue);

// 给 Slider 组件的 onValueChanged 事件再次添加一个监听器,该监听器为匿名方法
// 匿名方法会在 Slider 的值发生改变时被调用
slider.onValueChanged.AddListener((v) =>
{
    // 将字符串 "代码添加的监听" 和当前的值 v 拼接在一起,并打印出来
    print("代码添加的监听" + v);
});

14.2 知识点代码

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

public class Lesson14_UGUI基础_组合控件_Slider滑动条控件 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 Slider是什么
        //Slider是滑动条组件
        //是UGUI中用于处理滑动条相关交互的关键组件

        //默认创建的Slider由4组对象组成
        //父对象——Slider组件依附的对象
        //子对象——背景图、进度图、滑动块三组对象
        #endregion

        #region 知识点二 Slider参数相关

        #endregion

        #region 知识点三 Slider代码控制

        // 声明一个 Slider 变量 slider,用于存储该组件的引用
        Slider slider = this.GetComponent<Slider>();

        // 打印出 slider 的当前值
        print(slider.value);

        #endregion

        #region 知识点四 Slider监听事件的两种方式

        //1.拖脚本
        //2.代码添加

        // 给 Slider 组件的 onValueChanged 事件添加一个监听器,该监听器为 ChangeValue 方法
        slider.onValueChanged.AddListener(ChangeValue);

        // 给 Slider 组件的 onValueChanged 事件再次添加一个监听器,该监听器为匿名方法
        // 匿名方法会在 Slider 的值发生改变时被调用
        slider.onValueChanged.AddListener((v) =>
        {
            // 将字符串 "代码添加的监听" 和当前的值 v 拼接在一起,并打印出来
            print("代码添加的监听" + v);
        });
        #endregion
    }

    public void ChangeValue(float v)
    {
        print(v);
    }
}

14.3 练习题

在上节课的练习题基础上,请用现在所学知识,制作一个这样的功能:场景上有一个滑动条,可以通过它控制音效的音量大小

在游戏面板创建一个Silder控件,作为音量进度条

在MusicData脚本中添加一个音效大小变量,用于全局都能使用到

public class MusicData
{
    //音效大小
    public static float SoundValue = 1;
}

GamePanel脚本添加一个Slider变量,关联刚刚在游戏面板创建的滑动条组件。给滑动条添加值变化事件监听器,当滑动条的值改变时将滑动条的值设置给音效的大小MusicData.SoundValue。

// 音效大小滑动条
public Slider sliderSound;

void Start()
{
    // 初始化滑动条的值为 MusicData.SoundValue
    sliderSound.value = MusicData.SoundValue;
    // 给滑动条添加值变化事件监听器
    sliderSound.onValueChanged.AddListener((v) =>
    {
        // 处理音效的大小,将滑动条的值设置给 MusicData.SoundValue
        MusicData.SoundValue = v;
    });
}

在PlayerObject的开火方法的播放音效中,给每次开火添加的音效源组件时设置音效大小为音乐数据类中的音效大小 MusicData.SoundValue

// 播放音效
if (MusicData.SoundIsOpen)
{
    // 在当前游戏对象上添加 AudioSource 组件
    AudioSource audioSource = this.gameObject.AddComponent<AudioSource>();
    // 将剪辑赋值给 AudioSource 的剪辑属性
    audioSource.clip = ac;
    // 播放音效
    audioSource.Play();
    // 改变音效的大小为 MusicData.SoundValue
    audioSource.volume = MusicData.SoundValue;

    // 延迟0.8秒后销毁 AudioSource 组件
    Destroy(audioSource, 0.8f);
}

14.4 练习题代码

MusicData

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

public class MusicData
{
    //音效是否开启
    public static bool SoundIsOpen = true;
    //音效大小
    public static float SoundValue = 1;
}

GamePanel

// 引用命名空间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

// 游戏面板类,继承 MonoBehaviour 类
public class GamePanel : MonoBehaviour
{
    // 静态的 GamePanel 变量,用于存储该面板的引用
    public static GamePanel panel;

    // 攻击按钮
    public Button btnAtk;

    // 音效开关
    public Toggle togOn;
    public Toggle togOff;
    public ToggleGroup tg;

    // 音效大小滑动条
    public Slider sliderSound;

    // 名字文本
    public Text txtName;
    // 改名按钮
    public Button btnChangeName;

    // 玩家对象
    public PlayerObject player;

    // 在 Awake 方法中调用的方法
    private void Awake()
    {
        // 将当前面板的引用赋值给 panel
        panel = this;
    }

    // 在 Start 方法中调用的方法
    void Start()
    {
        // 给攻击按钮添加点击事件监听器
        btnAtk.onClick.AddListener(() =>
        {
            // 得到玩家对象并进行开火
            player.Fire();
        });

        // 给改名按钮添加点击事件监听器
        btnChangeName.onClick.AddListener(() =>
        {
            // 显示改名面板
            ChangeNamePanel.panel.gameObject.SetActive(true);
        });

        // 给音效开关的两个Toggle添加状态变化事件监听器
        togOn.onValueChanged.AddListener(TogChangeValue);
        togOff.onValueChanged.AddListener(TogChangeValue);

        // 初始化滑动条的值为 MusicData.SoundValue
        sliderSound.value = MusicData.SoundValue;
        // 给滑动条添加值变化事件监听器
        sliderSound.onValueChanged.AddListener((v) =>
        {
            // 处理音效的大小,将滑动条的值设置给 MusicData.SoundValue
            MusicData.SoundValue = v;
        });
    }

    // 播放音效开关变化时调用的方法
    private void TogChangeValue(bool v)
    {
        // 得到当前激活的Toggle
        foreach (Toggle item in tg.ActiveToggles())
        {
            if (item == togOn)
            {
                // 将音效开关设置为开启状态
                MusicData.SoundIsOpen = true;
            }
            else if (item == togOff)
            {
                // 将音效开关设置为关闭状态
                MusicData.SoundIsOpen = false;
            }
        }
    }
}

PlayerObject

// 引用命名空间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 玩家对象类,继承 MonoBehaviour 类
public class PlayerObject : MonoBehaviour
{
    // 音效剪辑
    public AudioClip ac;

    /// <summary>
    /// 开火方法
    /// </summary>
    public void Fire()
    {
        // 播放音效
        if (MusicData.SoundIsOpen)
        {
            // 在当前游戏对象上添加 AudioSource 组件
            AudioSource audioSource = this.gameObject.AddComponent<AudioSource>();
            // 将剪辑赋值给 AudioSource 的剪辑属性
            audioSource.clip = ac;
            // 播放音效
            audioSource.Play();
            // 改变音效的大小为 MusicData.SoundValue
            audioSource.volume = MusicData.SoundValue;

            // 延迟0.8秒后销毁 AudioSource 组件
            Destroy(audioSource, 0.8f);
        }

        // 动态创建子弹对象
        Instantiate(Resources.Load<GameObject>("Bullet"), this.transform.position, this.transform.rotation);
    }

    // Update 方法,每帧调用一次
    //private void Update()
    //{
    //    if(Input.GetMouseButtonDown(0))
    //    {
    //        Fire();
    //    }
    //}
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏