UGUI開發簡單音樂播放器之一

如下先展示音樂播放器的兩個主要界面:
主頁面:
這裏寫圖片描述
音樂列表:
這裏寫圖片描述
正如上面上所示,這個音樂播放器中包含有的按鈕有:播放按鈕,上一首按鈕,下一首按鈕,隨機播放按鈕,重複播放按鈕,播放界面與音樂播放界面的切換按鈕,聲音控制按鈕。這些便是在這兩個主要界面的主要按鈕。
下面再看對於聲音控制按鈕對應的界面所包含的按鈕,先來看這個界面如何:
簡單的設置
其中包含有三個滑動條,一個重置按鈕。
接下來再看編輯界面的界面情況:
這裏寫圖片描述
其中有一個編輯按鈕和一個界面切換按鈕,還有一個對應每首歌曲的刪除按鈕,另外,每個歌曲名也是一個按鈕。如上所述,這便是所有界面以及對應的操作鍵。
接下來分兩個主界面(即主頁面和音樂列表界面)具體來分析一下音樂播放器的具體實現問題。
主頁面:
如下是主界面的層次實現結構:
這裏寫圖片描述
其中有播放按鈕即是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語句中用或邏輯鏈接。
順序播放核心代碼:
這裏寫圖片描述
隨機代碼如下:
這裏寫圖片描述
剩餘內容下篇繼續。。。。

發佈了28 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章