2013-11-04 158 views
2

我在遊戲中遇到了一場風暴,所以我製作了一個環境音頻文件,它慢慢成長爲一場風暴,雨水逐漸消失,然後變成一個可循環暴風影音文件。下面是我已經做到了:如何在某個點播放遊戲音頻循環

// Play intro clip and merge into main loop 
var introTime = stormIntro.length; 
AudioSource.PlayClipAtPoint(stormIntro, Vector3.zero, 0.7); 
Invoke("StormMusic", introTime); 

目前我正在試圖做的是讓storm_intro音頻剪輯的長度,播放視頻片段,然後調用storm_loop的長度後開始的方式介紹已經完成。這有點作品,但不是真的,因爲偶爾有兩者之間的差距。那麼,我該如何做到這一點,以便過渡是無縫的?

回答

2

我現在正在爲Unity開發音樂中間件,而且我經常遇到這個問題。這些「空白」僅僅是因爲Unity在播放光盤之前需要加載音頻數據,所以它不能馬上播放。如果你想安排一些audioclip在特定點播放,你需要提前知道它,你需要使用AudioSource.PlayScheduled,就像@Kay提供的建議。

您需要注意,PlayScheduled不是在標準Time.time上運行,而是在AudioSettings.dspTime上運行。它永遠不會停頓,甚至可以在編輯器中的不同遊戲發佈之間保持一致。所以,你需要寫一些類似audio.PlayScheduled(AudioSettings.dspTime + expectedDelay);的文件來播放expectedDelay秒內的音頻片段。你需要保持expectedDelay在合理的水平,以便Unity可以加載剪輯;數量取決於您的音頻文件大小,它的導入設置,您正在優化的設備以及其他內容;我想你可以在幾次實驗後得出正確的值。

但是,如果您嘗試手動循環剪輯,並在同一地點重複啓動剪輯,則會再次遇到間隙。他們會更短,你可能無法注意到他們,但他們會在那裏 - 你可以通過錄制音頻輸出並在一些音頻編輯器中查看它來檢查。爲了擺脫這種情況,我使用具有相同剪輯的音頻源並依次啓動。

+0

啊,工作完美。非常感謝你的幫助! :) – Essential

2

我想這個差距是因爲加載StormMusic片段需要一些時間。因此,如果您可以通過對撞機手動觸發介紹,則應該按照您的要求進行操作。

不幸的是沒有PlayQueued交叉淡入淡出可以像動畫中的音頻源方法。

+0

感謝您的回覆,實際上這是一個好主意。不幸的是,我之前沒有使用過PlayScheduled,但它似乎沒有工作......無論我把什麼時間放在audio.PlayScheduled(15)中,它立即開始播放audioSource。絕對不會在清醒時玩。我可以在它之前放置一個產量WaitForSeconds,但是這會消除音頻提示點> _ < – Essential

+1

您應該注意,PlayScheduled不是標準時間,而是AudioSettings.dspTime作爲輸入。這段時間不會暫停,甚至可以繼續在編輯器中播放和停止遊戲。你應該寫audio.PlayScheduled(AudioSettings。dspTime + 15);代替。 –

0

我製作了一個名爲Introloop的解決方案,它是一個Unity插件,您可以播放背景音樂的BGM並進入無限循環而無需將文件剪切成2個片段。

我使用AudioSettings.dspTime相關的方法,如調度,以確保精確的循環。它還支持2個介入音頻之間的交叉淡入淡出。您只需爲每個音頻提供2個時間點,腳本將處理其餘的音頻雜耍。

http://forum.unity3d.com/threads/378370/