UGUI开发简单音乐播放器之一

来源:互联网 发布:知乎 张雪健 编辑:程序博客网 时间:2024/06/08 07:07

如下先展示音乐播放器的两个主要界面:
主页面:
这里写图片描述
音乐列表:
这里写图片描述
正如上面上所示,这个音乐播放器中包含有的按钮有:播放按钮,上一首按钮,下一首按钮,随机播放按钮,重复播放按钮,播放界面与音乐播放界面的切换按钮,声音控制按钮。这些便是在这两个主要界面的主要按钮。
下面再看对于声音控制按钮对应的界面所包含的按钮,先来看这个界面如何:
简单的设置
其中包含有三个滑动条,一个重置按钮。
接下来再看编辑界面的界面情况:
这里写图片描述
其中有一个编辑按钮和一个界面切换按钮,还有一个对应每首歌曲的删除按钮,另外,每个歌曲名也是一个按钮。如上所述,这便是所有界面以及对应的操作键。
接下来分两个主界面(即主页面和音乐列表界面)具体来分析一下音乐播放器的具体实现问题。
主页面:
如下是主界面的层次实现结构:
这里写图片描述
其中有播放按钮即是PlayBT,随机播放按钮ShuffleBT,重复播放按钮RePeatBT,下一首按钮NextBT,上一首按钮BackBT,界面切换按钮ListBT,声音按钮SoundBT。还有其他的控制键是一些界面修饰图片。
按钮的事件监听方式大体类似,所以此处只以播放按钮为例介绍;
playBT.onClick.AddListener(OnPlayBTnClick);//对播放按钮进行监听
void OnPlayBTnClick()
{
showPlayBT = !showPlayBT;
if (!showPlayBT)
{
pc._audioSource.Pause();
}
else
{
pc._audioSource.Play();
}
}
showPlayBT标志位用以可以达到按一下音乐暂停,再按一下暂停的效果,其他按钮事件监听过程中广泛采用此方法达到这种效果。有了这些按钮及监听事件之后,就需要在这些按钮的监听函数中放入要监听的事件了。分析这个功能块中的所有按钮功能不难看出所有的按钮都是要控制播放段代码。这段播放段代码就是整个播放器的核心,所有播放器的操作都是基于这段播放段代码进行操作的,将它比喻音乐播放器的“发动机”我觉得应该不过分。
分析一下这段核心代码应该具有什么样的功能。
(1)当音乐播放器打开时应该能自动播放音乐。
(2)当按钮触发后他应该能获取按钮触发产生的标志位,同时执行相应的功能。可见,各个按钮触发的功能应该是被包含在这段核心代码里,等待相应标志位到来后进行执行。如此说来这个标志位很像是一把锁,当这把锁开时系统才可以执行相应的代码。
(3)因为其中有随机播放按钮,随机播放与顺序播放是由不同的机制,顺序播放可以直接按照音乐播放列表的索引播放即可,但是随机播放按钮是根据随机函数生成的一个整数来对应音乐列表的索引进行播放的。所以说播放的核心应该编写两套代码。一套用来执行顺序播放情况下的逻辑操作,一套用来执行随机播放情况下的逻辑操作。
(4)应能支持歌曲的暂停、播放、下一首、上一首、重复播放、以及点击歌曲名就播放相应歌曲的功能。
(5)为了每播放一首歌曲应能是歌曲能够完整播放完,而不使他因为其他代码的影响而导致歌曲出现卡顿,不连续,甚至根本不能播放的情况。
那么依次来处理上面的问题。在系统中设置有一个音频剪辑数组public AudioClip[] ac来接收所有的歌曲,同时还设置有一个数组队列public static ArrayList alb = new ArrayList()来暂时存储这些歌曲的按钮对象。在这个队列中对歌曲编辑删除功能仅仅作用在此数组中而不影响音频剪辑数组中的资源,这样保证了数据的安全性,同时歌曲的列表显示也是以这个数组队列为准,以及各操作键根据的歌曲索引也都是以这个数组队列为准。那么音频剪辑数组的作用就是动态数组可以根据其所获得的歌曲按钮中子对象事现存好的歌曲名找出这个歌曲在音频剪辑的什么地方,进而将它给播放控制函数。具体的函数语句为:
for (int j = 0; j < list.transform.childCount; j++)
{//初始化动态数组
alb.Add(list.transform.GetChild(j));//将list中的子对象依次加入到动态数组中,注意加入到其中的是音频的transform组件
Transform b;
b = (Transform)MusicBtnListener.alb[i];
if(ac1.ac[j].name==b.FindChild(“MusicInformation”).GetComponent().text) ;
因为数组是object类在向transform类转换时需要显示类型转换。如下面的if判断语句就是对播放歌曲的位置的判断,当你两者条件满足时就可以将对应的音频剪辑给播放函数予以播放。
(1)对于此问题只需要将这个播放模块放在Update函数中使函数在一开始就可以执行,这样就可以执行了。
(2)这个问题也好解决,有这样控制标志位的按钮有好多个,同时当每个按钮被触发后都要求能够对播放核心代码进行操作,所以可以将这些函数放在一个if函数中用或语句连接,如此当只要有一个标志位满足条件时就可以触发控制核心代码的执行。
(3)即将核心代码分成两个部分一个随机,一个顺序播放,所有的按钮操作都要对这两个核心代码进行操作。
(4)对于播放、暂停操作可以在播放按钮的触发函数里进行编辑,如下:
void OnPlayBTnClick()
{
//pc.PlayingControl();
showPlayBT = !showPlayBT;
if (!showPlayBT)
{
pc._audioSource.Pause();//暂停音乐播放
}
else
{
pc._audioSource.Play();//播放音乐
}
}
下一首、上一首、重复播放、以及点击歌曲名就播放相应歌曲这几个功能只需要对核心代码向外面坦露的歌曲索引进行操作就可以了。索引为a;具体实现见下面的代码。
(5)这一项只需要设置包含Audiosource.isplaying语句进行判断当前是否有音乐在播放就好了,有音乐在播放就不允许系统去执行核心代码,跟第二个问题一样,只有满足了条件才可以访问核心代码,所以可以见那个这句与上面的标志位放在一个if语句中用或逻辑链接。
顺序播放核心代码:
这里写图片描述
随机代码如下:
这里写图片描述
剩余内容下篇继续。。。。