2023年7月11日发(作者:)
⾳乐播放器的实现(四)——歌曲列表、顺序播放、单曲循环、随机播放、⾃动下⼀曲⾳乐播放器的实现(四)—— 歌曲列表、顺序播放、单曲循环、随机播放、⾃动下⼀曲传送门:(完整⼯程见第五章篇尾)前⾔:上⼀篇简单的实现了算是顺序播放的上⼀曲和下⼀曲,这篇加上播放模式(顺序播放、单曲循环、随机播放),再优化上/下⼀曲,同时显⽰所有歌曲的列表,并能点击播放对应的歌曲⾳频。先看下最终效果:具体操作⼀、⾸先,我们还是先完善UI⾯板:1、在上⼀篇的基础上,新建⼀个按钮Button命名为pModeImage,Button的图⽚⽤来显⽰播放模式对应的图⽚(⽂本可以删掉);2、准备三张图⽚放⼊Project⾯板中的Resources⽂件夹下的Sprite⽂件夹中(可根据⾃⼰需求放置,但⼀定要在Resources⽂件夹下,当然后台代码对应的路径也要更改),分别命名为:stright、circle和random;3、新建⼀个Scroll View,⽤来显⽰歌曲的列表,在content下新建⼀个Button,⽤来点击播放对应歌曲。在content上添加布局组件,调整相关参数,使Button⼤⼩位置合适,最后把该Button拖⾄Project⾯板中形成⼀个预制体,存放在Prefab⽂件夹中,再删掉或隐藏掉content下的Button按钮。最终效果如下图所⽰:⼆、核⼼代码1、相对上⼀篇,我把播放⾳频的⽅法独⽴了出来,⽅便调⽤。 ///
播放索引为index的⾳频 /// /// ⾳频索引 void playMusic(int index) { = auc[index]; //⾳频播放器的⾳频为aus数组中索引对应的⾳频 = 0; //初始化进度条 = 0; //初始化⾳乐的播放时间(从头开始播) (); //播放⾳频 }2、⾳乐列表实例化每个⾳频按钮,形成⾳乐列表,该⽅法在Start()中调⽤,即开始运⾏时就形成歌曲列表。(其中item为上⾯制作的Button预制体。) public GameObject item; //要实例化的列表按钮对象,即Button预制体 private GameObject it; //实例化出的列表⾳频按钮 void initItem()//⾳频列表 { List
的长度 (g); //把列表L的内容复制到数组g中 //给每个⾳频按钮加上监听,点击即播放对应⾳频 foreach(GameObject gob in g) { ponent
播放模式 /// public void PlayMode() { t++; if (t == 1) { //播放模式为顺序播放 playM = t; //上传顺序播放对应的图⽚ ponent
}下⼀曲:private void NextMusic() { if(playM==) //如果播放模式是随机播放 randomRange(); //随机播放 else { index++; //索引加⼀ //若索引等于aus⾳频数组的长度,即当前播放的⾳频是最后⼀⾸,则下⼀⾸应为aus数组列表的第⼀⾸ if (index == ) index = 0; playMusic(index);//播放⾳频 }
}
随机播放时调⽤的代码: public void randomRange()//随机播放 { int r = (0, );//⽣成随机数(包含0,不包含);
if(index == r) //如果随机数等于当前播放的⾳频的索引(避免播放同⼀⾸) r++; //索引加⼀ //若索引等于aus⾳频数组的长度,即当前播放的⾳频是最后⼀⾸,则下⼀⾸应为aus数组列表的第⼀⾸ if (r == ) r = 0; playMusic(r);//播放⾳频 }4、⾃动播放下⼀曲当进度条⾛到最后时,播放下⼀曲,若是单曲循环,则依旧播放当前的⾳频 void Slider()//当进度条⾛到最后时,播放下⼀曲 { if (currentHour == clipHour && currentMinute == clipMinute && currentSecond == clipSecond) { if (playM == 1)//如果播放模式是单曲循环,下⼀曲还是当前这⾸ playMusic(index); else NextMusic();//下⼀曲 } }完整版代码:DragSlider脚本不变。 Player脚本如下:using System;using c;using UnityEngine;using ;public class Player: MonoBehaviour { public enum playMode { stright,//列表循环 circle1,//单曲循环 random //随机播放 } public Text musicName; //显⽰歌曲的名字及歌⼿ public Text nowTime; //显⽰歌曲已播放的时间长度 public Text allTime; //显⽰当前歌曲的总时间长度 public Slider slid; //进度条 public Transform buttons; //按钮所在的集合体 public AudioClip[] auc; //存放歌曲的数组 public AudioClip[] auc; //存放歌曲的数组 public AudioSource aus; //⾳频播放器 private int index; //数组aus的索引 private int currentHour, currentMinute, currentSecond; //已播放的时间(时、分、秒) private int clipHour, clipMinute, clipSecond; //总时间(时、分、秒) private playMode playM=t; //初始是顺序播放 private GameObject pModeImage; //播放模式的图⽚切换 private GameObject vioce_butt, voice_text, voice_slid; //⾳量按钮、⾳量数字、⾳量进度条 int clickNum=0,value;//变量 bool mouseIn;//⿏标进⼊ public GameObject item; //要实例化的列表按钮对象 private GameObject it; //实例化出的列表⾳频按钮 public static Player _instance; void initItem()//⾳频列表 { List
的长度 (g); //把列表L的内容复制到数组g中 //给每个⾳频按钮加上监听,点击即播放对应⾳频 foreach(GameObject gob in g) { ponent
void Start() { _instance = this; (); //开始运⾏时不播放,点播放键才开始播放 #region 注:该⽅式虽然可以直接达到拖动进度条就播放到进度条当前的⾳乐,但会产⽣滋滋啦啦的杂⾳,是因为进度条value变化,使之不断调⽤onValueChanged,从⽽让⾳乐的进度发⽣了变化,⾳乐前后颠倒,不断重叠 /// ///
所以新建了个DragSlider脚本,挂在进度条上,来实现拖动播放的效果 /// //tener(delegate //{ // //加上之后,避免拖动进度条到最后不松⼿时报错 // if ( == 1) // return; // //给进度条添加事件监听,每当拖动进度条,歌曲从相应的位置播放 // = * ; //}); #endregion foreach (Transform go in buttons) //遍历所有的操作按钮 { ponent
//显⽰当前播放过的时间 = ("{0:D2}:{1:D2}:{2:D2} ", currentHour, currentMinute, currentSecond); //进度条变化 //(之后更新版)如果当前没有拖拽进度条 if(!) = / ; } ///
歌曲总时间 /// void alltime() { // = 0; clipHour = (int) / 3600;//时 clipMinute = (int)( - clipHour * 3600) / 60;//分 clipSecond = (int)( - clipHour * 3600 - clipMinute * 60);//秒 //显⽰歌曲总时间 = ("{0:D2}:{1:D2}:{2:D2}", clipHour, clipMinute, clipSecond); } ///
上⼀曲 /// private void LastMusic() { if (playM == ) //如果播放模式是随机播放 randomRange(); //随机播放 else { index--; //索引减⼀ //若索引等于-1,即当前播放的⾳频是aus数组列表的第⼀⾸,则上⼀⾸应为aus数组列表的最后⼀⾸ if (index == -1) index = - 1; playMusic(index); }
} private void Pause() //暂停 { (); } private void Play() //播放 { //如果当前正在播放,则返回 if (ing) return; (); } ///
下⼀曲 /// public void NextMusic() { if(playM==) //如果播放模式是随机播放 randomRange(); //随机播放 else { index++; //索引加⼀ //若索引等于aus⾳频数组的长度,即当前播放的⾳频是最后⼀⾸,则下⼀⾸应为aus数组列表的第⼀⾸ if (index == ) index = 0; playMusic(index);//播放⾳频 }
}
void nowMusic() //当前的⾳频 { AudioClip clip = ; //当前播放的⾳频 string n = ; //当前播放的⾳频的名字 string[] na = ('-'); //以“-”为分割点,把⾳频名分为若⼲部分 //显⽰当前正在播放的歌曲的名字【歌曲名(默认字体,25号)+歌⼿名(默认字体,18号,红⾊)的形式】 = ("
播放索引为index的⾳频 /// /// ⾳频索引 void playMusic(int index) { = auc[index]; //⾳频播放器的⾳频为aus数组中索引对应的⾳频 = 0; //初始化进度条 = 0; //初始化⾳乐的播放时间(从头开始播) (); //播放⾳频 } //变量t int t = 1; ///
播放模式 /// public void PlayMode() { t++; if (t == 1) { //播放模式为顺序播放 playM = t; //上传顺序播放对应的图⽚ ponent
进度条的值 * 0.01f。(因为volume的范围为:0~1) = voice_ponent
} ///
单机左键,隐藏所有要隐藏的 /// void setActiveFalse() { if(seButtonDown(0)) { if(mouseIn==false) voice_ive(false); } }
public void randomRange()//随机播放 { int r = (0, );//⽣成随机数(包含0,不包含);
if(index == r) //如果随机数等于当前播放的⾳频的索引(避免播放同⼀⾸) r++; //索引加⼀ //若索引等于aus⾳频数组的长度,即当前播放的⾳频是最后⼀⾸,则下⼀⾸应为aus数组列表的第⼀⾸ if (r == ) r = 0; playMusic(r);//播放⾳频 }
}代码备注的也⽐较详细,若⽂中存在错误或者描述不清的地⽅也请指正,欢迎评论区留⾔共同探讨,以上。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689065038a202148.html
评论列表(0条)