近期发现关于Unity实现音乐播放器的资源较少,我来放一波!

  • 介绍
    • 逻辑
    • 场景搭建
    • 代码部分
    • 歌词预制体创建
    • 结束

介绍

首先,这个功能的实现仅为demo,给予正在实现本功能的小伙伴一点思路.如果帮到了一些人也属初心所向,不喜勿喷!

工程源码::Demo源码工程

逻辑

主要依赖于UGUI Scroll View通过调用它的verticalNormalizedPosition属性来实现轮播滚动的效果.

歌词的存储格式常见的为**.lrc文件,通过IO将每一行读取到一个List**里,再由循环将每段歌词实例化在Scroll View 的 Content节点下.

场景搭建

创建一个Scene场景 : VideoScene

创建一个Scroll View 如图:

在父物体 Canvas层 挂载一个 Audio Source 同时把我们想要播放的歌曲文件拖到 AudioCilp这个属性里

配置 Content节点的组件

代码部分

可以创建一个脚本 命名 AudioTest.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class AudioTest : MonoBehaviour
{public GameObject lrcText;public Transform lrcTextparent;public ScrollRect ScrollRect;public AudioSource audioSource;public float GridIndexList;public float GridIndexList2;public float EndPos;private bool m_IsLock = false;private void Start(){audioSource.Play();//ProcessingData(ReadLrcFile(Application.dataPath + "/lyric/好久不见-陈奕迅.lrc"));ProcessingData(Readlyirc(src));Debug.Log("floattimelist:" + floattimelist.Count);Debug.Log("stringlyriclist:" + stringlyriclist.Count);ShowLrc();currindex = 0;ScrollRect.verticalNormalizedPosition = 0;}int lastindex = -1;int currindex = 0;// private void Update()// {//     for (int i = 0; i < floattimelist.Count; i++)//     {//         if (audioSource.time >= floattimelist[i] && audioSource.time < floattimelist[i + 1])//         {//             currindex = i;//             if (currindex != lastindex)//             {//                 lastindex = currindex;//                 Debug.Log("句子:" + currindex);//                 ShowLrc(currindex);//             }//             return;//         }//     }// }private void Update(){if (Input.GetMouseButtonDown(0)){m_IsLock = true;}for (int i = 0; i < floattimelist.Count; i++){if (audioSource.time >= floattimelist[i] && audioSource.time < floattimelist[i + 1]){currindex = i;if (currindex != lastindex){lastindex = currindex;//Debug.Log("句子:" + ScrollRect.verticalNormalizedPosition);ShowLrc(currindex);m_IsLock = false;}return;}}}private void FixedUpdate(){if (!m_IsLock){PlayUIAnim(EndPos, 0.05f);}}public void PlayUIAnim(float endPos, float endTime){ScrollRect.verticalNormalizedPosition = Mathf.Lerp(ScrollRect.verticalNormalizedPosition, endPos, endTime);}float temp = 1;/// <summary>/// 显示lyric/// </summary>/// <param name="index"></param>void ShowLrc(int index){// if (index >= 1)// {//     temp -= offest;//     if (temp >= 0)//     {//         ScrollRect.verticalNormalizedPosition = temp;//         Debug.Log(temp);//     }// }// texts[index].color = Color.green;// if (index > 0 && index < stringlyriclist.Count)// {//     texts[index - 1].color = Color.gray;// }index -= 1;//ScrollRect.verticalNormalizedPosition = 1f - ((float)index / ((float)texts.Count - 3f));  EndPos = 1f - ((float)index / ((float)texts.Count - 3f));GridIndexList = (index / texts.Count);GridIndexList2 = 1f - (index / texts.Count);texts[index + 1].color = Color.black;texts[index + 1].fontStyle = FontStyle.Bold;texts[index + 1].fontSize = 30;if (index > 0 && index < stringlyriclist.Count){texts[index].color = Color.gray;texts[index].fontStyle = FontStyle.Normal;texts[index].fontSize = 24;}}List<Text> texts = new List<Text>();float offest = 0;void ShowLrc(){ScrollRect.verticalNormalizedPosition = 1;offest = 1f / (stringlyriclist.Count / 2f);Debug.Log("offset" + offest);for (int i = 0; i < stringlyriclist.Count; i++){GameObject lyirc = Instantiate<GameObject>(lrcText, lrcTextparent);Text text = lyirc.GetComponent<Text>();text.text = stringlyriclist[i];text.color = Color.gray;lyirc.SetActive(true);texts.Add(text);}}/// <summary>/// 读取 lyric 文件/// </summary>/// <param name="path"></param>/// <returns></returns>List<string> ReadLrcFile(string path){//存放歌词listList<string> lyric = new List<string>();StreamReader sr = new StreamReader(path, Encoding.Default);string str = "";while ((str = sr.ReadLine()) != null){lyric.Add(str);//Debug.Log(str);}return lyric;}/// <summary>/// 读取 lyric 文件/// </summary>/// <param name="path"></param>/// <returns></returns>List<string> Readlyirc(string lyirc){List<string> lyric = new List<string>();string[] strArr = lyirc.Split(new char[] { '\n' });for (int i = 0; i < strArr.Length; i++){lyric.Add(strArr[i]);}return lyric;}// 时间public List<float> floattimelist = new List<float>();// 句子public List<string> stringlyriclist = new List<string>();/// <summary>/// 解析数据/// </summary>/// <param name="dataList">数据</param>/// <returns></returns>void ProcessingData(List<string> dataList){// 所有数据for (int i = 0; i < dataList.Count; i++){//Debug.Log(dataList[i]);string[] strarry = dataList[i].Split(new char[] { '[', ']' });if (strarry != null && strarry.Length > 0){for (int j = 1; j < strarry.Length; j++){string tempstr = strarry[j];//这是标题 --- 创作者if (tempstr.StartsWith("ti") || tempstr.StartsWith("ar") || tempstr.StartsWith("al") || tempstr.StartsWith("by") || tempstr.StartsWith("offset")){string[] strarry1 = tempstr.Split(':');//valuePairs.Add(strarry1[0], strarry1[1]);}else{//这是内容if (tempstr.Contains(":")){string[] strarry1 = tempstr.Split(':');float m = float.Parse(strarry1[0]) * 60;float s = float.Parse(strarry1[1]);//ms ms = (m + s).ToString();//Debug.Log(ms);//时间floattimelist.Add(m + s);}else{//句子stringlyriclist.Add(tempstr);}}}}}}string src = "[00:00.17]苏星婕 - 不期而遇的风\n" +"[00:00.67]作词:峦无眠\n" +"[00:00.88]作曲:辛雯\n" +"[00:01.10]编曲:闫天聪\n" +"[00:01.31]音乐制作:翌月文化\n" +"[00:01.67]监制:成若颖、Wenasa黄嘉雯\n" +"[00:02.09]混音、母带:无机草莓\n" +"[00:02.45]录音师:无机草莓\n" +"[00:02.81]录音棚:莫非录音棚(成都)\n" +"[00:03.23]总企划:zoki、佰\n" +"[00:03.45]总策划:包包子\n" +"[00:03.73]艺人统筹:zoki、佰、要回家\n" +"[00:17.80]听说晚风来的时候适合遇见\n" +"[00:21.59]如星星和海平面\n" +"[00:25.01]总相遇在晴天的夜晚\n" +"[00:27.81]我想我和你只是缺对的时间\n" +"[00:33.15]你说我对星空许过的每个愿\n" +"[00:37.10]有一天都会实现\n" +"[00:40.11]而那些放飞过的思念\n" +"[00:43.24]会带着你如约而来的出现\n" +"[00:47.20]我知道你会像不期而遇的风\n" +"[00:51.24]突然出现在某一个黄昏\n" +"[00:54.83]和落日一起穿过人潮汹涌\n" +"[00:58.81]扑面而来和我相拥\n" +"[01:02.58]我知道你会像不期而遇的风\n" +"[01:06.69]携带着我等候已久的梦\n" +"[01:10.30]借月亮的光和山野的雾灯\n" +"[01:14.27]填满遗憾的每个裂缝\n" +"[01:35.14]你说我对星空许过的每个愿\n" +"[01:38.97]有一天都会实现\n" +"[01:41.95]而那些放飞过的思念\n" +"[01:45.21]会带着你如约而来的出现\n" +"[01:48.95]我知道你会像不期而遇的风\n" +"[01:53.08]突然出现在某一个黄昏\n" +"[01:56.85]和落日一起穿过人潮汹涌\n" +"[02:00.71]扑面而来和我相拥\n" +"[02:04.62]我知道你会像不期而遇的风\n" +"[02:08.45]携带着我等候已久的梦\n" +"[02:12.25]借月亮的光和山野的雾灯\n" +"[02:16.18]填满遗憾的每个裂缝\n" +"[02:20.04]我知道你会像不期而遇的风\n" +"[02:23.88]突然出现在某一个黄昏\n" +"[02:27.84]和落日一起穿过人潮汹涌\n" +"[02:31.69]扑面而来和我相拥\n" +"[02:35.49]我知道你会像不期而遇的风\n" +"[02:39.41]携带着我等候已久的梦\n" +"[02:43.26]借月亮的光和山野的雾灯\n" +"[02:47.16]填满遗憾的每个裂缝";}

歌词预制体创建

结束

Unity实现音频播放器[QQ音乐,网易云等效果]相关推荐

  1. mac音乐播放器QQ音乐好用吗?vip绿钻的QQ音乐有哪些版本优势?

    mac音乐播放器QQ音乐好用吗?当然!QQ音乐是Mac平台用户体验极佳的音乐播放器,最新最热的排行榜.歌单.电台.MV天天推荐,智能音乐搜索.猜你喜欢帮你轻松发现音乐.更何况是不需要绿钻和付费包,VI ...

  2. Python Pyside2 Pinger新手QQ音乐网易云酷狗爬虫下载

    此文记录了Pinger优化2.0版本,仅此作为学习Python的动力: Pinger 1.0请看前一篇的博客! Pyside2新手1400行代码QQ音乐网易云酷狗轻松下载 优化一: 更改Pinger的 ...

  3. ubuntu qq音乐/网易云音乐 播放没有声音,播放mv有声音,解决办法

    重装了ubuntu系统,下载了qq音乐,播放音乐没有声音,忍不了,解决办法: 终端中执行如下命令 sudo apt install ubuntu-restricted-extras reboot 如果 ...

  4. html5卡拉OK音乐播放器,QQ音乐播放器怎么打开卡拉OK模式

    QQ音乐播放器怎么打开卡拉OK模式 时间:2020-08-05 12:25:56 责任编辑:随便就行 QQ音乐播放器怎么打开卡拉OK模式?QQ音乐播放器是生活中常用的音乐播放器,很多人在使用QQ音乐播 ...

  5. [API ]新浪微博腾讯QQ音乐网易云音乐小米云钉钉笔记百度高德地图淘宝阿里云 API

    常用&免费 微博: 需要先注册登录 https://open.weibo.com/wiki/API bilibili b站(part1@社会易姐QwQ) https://github.com/ ...

  6. python qq音乐网易云音乐酷狗音乐

    网易云 1. 评论 https://music.163.com/weapi/v1/resource/comments/R_SO_4_歌曲id?csrf_token= 可以直接传入空{} 1.1 {&q ...

  7. 前端学习小demo:使用HTML+CSS+bootstrap+Vue2.0编写一个简易的音乐播放器(仿网易云)

    具体的操作流程(实现步骤): 1.歌曲搜索 2.歌曲播放 3.歌曲评论 4.播放歌曲的MV(有的歌曲没有MV) 代码编写过程: 1.创建一个Vue项目(前提是安装好了node.js.npm.vue) ...

  8. Pyside2新手1400行代码QQ音乐网易云酷狗轻松下载

    学习python,处于一种好奇和尝试,之前没接触过表示很难,不过只要肯摸索还是能够学到点皮毛.例如像我这样的三脚猫功夫,简单的入门,简单的pyside2 GUI,以及简单的爬虫.在这里感谢以下up主, ...

  9. 【jquery】一款不错的音频播放器——Amazing Audio Player

    前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器--Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...

  10. (转载)历史——YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生

    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 23 日,世界读书日.在 1564 年的这一天,全世界最卓越的文学家之一莎士比亚出生:1616 年的这一天,莎 ...

最新文章

  1. 详解Asp.net MVC DropDownLists
  2. javascript 随机点名
  3. SAP UI5 的前世今生
  4. WPF 实现 DataGrid/ListView 分页控件
  5. 巧妙使用信用卡N个小技巧
  6. matlab多项式加法运算,matlab多项式运算与代数方程求解解析.ppt
  7. Loj #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set
  8. 常见的两大交换机硬故障
  9. Jquery跨域请求php数据(jsonp)
  10. 开始开发HoloLens应用吧 Start Developing HoloLens Apps Today
  11. Airplay vs DLNA vs Miracast
  12. 使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程)
  13. 如何更换python版本
  14. 解决手机端页面的鼠标点击出现蓝色背景
  15. 图片如何转换为文字?这些软件可以实现
  16. ST-GCN/AS-GCN报错cannot import name “import_class“
  17. 深度学习准备之安装双系统
  18. SQL Server2008r2安装
  19. 爬取腾讯视频网站数据
  20. Hangman Judge, UVa 489

热门文章

  1. 计算机的最简单的操作,电脑无线投屏怎么使用(手把手教你最简单且实用的操作方法)...
  2. C语言什么是时间序列,什么是横截面数据、时间序列数据和面板数据
  3. 时间序列数据处理2——时间序列聚类算法
  4. 从原子结构--PN结原理--光伏发电
  5. qqxml代码-班级作业xml卡片代码班级作业
  6. 计算机排版系统程序,《计算机排版系统.doc
  7. 电子病历系统源码 医院管理系统源码
  8. 医院随访系统标准化流程之三级随访
  9. 短视频解析 MD5修改 ,为什么要修改MD5
  10. Excel键盘快捷键大全(二)