当前位置: 首页 > article >正文

Unity 实现音频进度条(可控制)

目录

前言

一、拼UI

二、上代码


前言

 效果如图:(因为是GIF格式,录不上音频)


一、拼UI

1.新建空物体添加AudioSource,给AudioSource添加音频文件,取消勾选PlayOnAwake,勾选上Loop

2.创建Slider,用于控制音频进度

3.创建Button,用于控制播放和暂停

4.创建两个Text,分别为当前进度时间和总音频时间

5.准备好播放和暂停的2个UI素材

二、上代码

代码如下:

using UnityEngine;
using UnityEngine.UI;

public class SZJCAudioProgressBar : MonoBehaviour
{
    public AudioSource audioSource;        // 音频源
    public Slider progressBar;              // 进度条
    public Text currentTimeText;            // 当前时间文本
    public Text totalTimeText;              // 总时间文本
    public Button playPauseButton;          // 播放/暂停按钮
    public Sprite playSprite;//播放图片
    public Sprite PauseSprite;//暂停图片

    private bool isPlaying = false;         // 播放状态标记

    void Start()
    {
        // 将 Slider 的值设置为 0
        progressBar.value = 0;

        // 设置总时间文本
        totalTimeText.text = FormatTime(audioSource.clip.length);

        // 添加事件监听器
        progressBar.onValueChanged.AddListener(OnProgressBarValueChanged);

        // 添加按钮点击事件
        playPauseButton.onClick.AddListener(TogglePlayPause);
    }

    void Update()
    {
        // 更新进度条的值和当前时间文本
        if (audioSource.isPlaying)
        {
            progressBar.value = audioSource.time / audioSource.clip.length;
            currentTimeText.text = FormatTime(audioSource.time);
        }
        else if (audioSource.time >= audioSource.clip.length) // 检查是否播放完毕
        {
            // 将播放状态设置为 false
            isPlaying = false;
            playPauseButton.GetComponent<Image>().sprite = playSprite; // 更新按钮文本
            progressBar.value = 1; // 将进度条设置为满
            currentTimeText.text = FormatTime(audioSource.clip.length); // 更新当前时间文本为总时间
        }
    }

    // 切换播放和暂停状态
    private void TogglePlayPause()
    {
        if (isPlaying)
        {
            audioSource.Pause();
            playPauseButton.GetComponent<Image>().sprite = playSprite; // 更新按钮文本
        }
        else
        {
            audioSource.Play();
            playPauseButton.GetComponent<Image>().sprite = PauseSprite; // 更新按钮文本
        }
        isPlaying = !isPlaying; // 切换播放状态
    }

    // 当 Slider 的值改变时调用此方法
    private void OnProgressBarValueChanged(float value)
    {
        if (value < 1)
        {
            // 根据进度条的值设置音频播放的时间
            audioSource.time = value * audioSource.clip.length;
        }
    }

    // 格式化时间为 "分:秒" 格式
    private string FormatTime(float time)
    {
        int minutes = Mathf.FloorToInt(time / 60);
        int seconds = Mathf.FloorToInt(time % 60);
        return string.Format("{0:00}:{1:00}", minutes, seconds);
    }
}

        直接把代码找个地方放上去,然后把刚才创建的内容依次拖拽上就好了。

        另外,笔者给playSprite和pauseSprite拖拽的是播放和暂停的两个图片素材,随便找个俩图片代替就行,不然会报空哈~


http://www.kler.cn/a/369517.html

相关文章:

  • InnoDB存储引擎对MVCC实现
  • 【mod分享】极品飞车9冬日mod,支持光追,想体验一把冬天的Rockport市吗
  • 玩转PyCharm:常用操作和快捷键
  • ubuntu-开机黑屏问题快速解决方法
  • Mysql(十) --- 用户权限和管理
  • Spring中的SPI:揭秘灵活扩展的秘密武器
  • iframe里放的视频,如何采用纯css适配
  • 完美结局 ubuntu开机卡在等待网络连接
  • 【深度学习】合合信息:生成式AI时代的内容安全与系统构建
  • Linux运行时动态库搜索路径优先级
  • 偷懒总结篇|贪心算法|动态规划|单调栈|图论
  • Mqtt协议快速入门Demo
  • RK3568 android11 usb接口TP与电磁笔触点上报优先级问题
  • HCIP-HarmonyOS Application Developer 习题(十八)
  • Unity URP ShaderGraph 基本设置
  • [论文阅读]Detecting Pretraining Data from Large Language Models
  • Windows服务器如何远程登录 #服务器远程教程#
  • 大数据-192 DataX - 异构数据源的同步工具 核心模块 Reader Writer
  • 【微服务】Nacos 注册中心
  • 实时面部情绪识别技术解析
  • 大券商和小券商开户,哪个更划算?
  • 算法:利用前序序列和中序序列构造二叉树
  • Spring常见面试题总结
  • java程序,生成mysql测试数据
  • 高并发-负载均衡
  • 《Python游戏编程入门》注-第4章1