我寫了一個腳本,從一個陣列中隨機播放音頻檔案。但我不知道如何在檔案結束時淡出當前播放的音頻并淡入新的音頻檔案。以下是代碼。我現在使用的音頻檔案是mp3檔案,我有一個計劃要換成wave檔案。 有什么建議嗎
using System.Collections;
using System.Collections.Generic;
using System.Collections.Generic; using UnityEngine; using UnityEngine;
using Random = UnityEngine.Random;
public class BackGroundAudio : MonoBehaviour
{
public AudioSource audioSource。
public AudioClip[] audioClipsArray;
public String FileName;
//Start在第一幀更新前被呼叫。
void awake()
{
audioSource = GetComponent<AudioSource>()。
}
void Start()?
{
}
//Update每幀被呼叫一次
void Update()
{
if (! audioSource.isPlaying)
{
PlayRandom()。
}
}
void PlayRandom()
{
audioSource.clip=audioClipsArray[Random.Range(0, audioClipsArray.Length)]。
audioSource.clip =trimSilence(audioSource.clip);
audioSource.PlayOneShot(audioSource.clip)。
}
AudioClip trimSilence(AudioClip inputAudio, float threshold = 0.05f)
{
//將輸入音頻的樣本復制到一個陣列。AudioClip使用交錯格式,所以樣本的長度要乘以通道數。
float[] samplesOriginal = new float[輸入音頻.樣本*輸入音頻.通道]。
inputAudio.GetData(samplesOriginal, 0)。
//找到超過閾值的第一個和最后一個樣本(來自任何通道)。
int audioStart = Array.FindIndex(samplesOriginal, sample => sample > threshold),
audioEnd = Array.FindLastIndex(samplesOriginal, sample => sample > threshold)。
//將修剪好的音頻資料復制到另一個陣列中。
float[] samplesTrimmed = new float[ audioEnd - audioStart] 。
Array.Copy(samplesOriginal, audioStart, samplesTrimmed, 0, samplesTrimmed.Length)。
//為修剪的音頻資料創建新的AudioClip。
AudioClip trimmedAudio = AudioClip.Create(inputAudio.name, samplesTrimmed.Length / inputAudio.channels, inputAudio.channels, inputAudio.frequency, false)。
trimmedAudio.SetData(samplesTrimmed, 0) 。
return trimmedAudio;
}
uj5u.com熱心網友回復:
像這樣的東西應該可以做到,你可以用音頻混合器做更好的解決方案,但我相信這是最低努力/最簡單的實作。
換句話說:當你開始一個片段時,它將在FADE_TIME_SECONDS秒內將音頻源的音量從0設定為1。然后在同一時間,我們啟動一個Coroutine,用剪輯的長度減去FADE_TIME_SECONDS,做同樣的事情,但從1到0,這為下一個音軌做了設定,開始音量為0,并漸漸進入。
代碼中:
const float FADE_TIME_SECONDS = 5;
void PlayRandom()
{
StartCoroutine(FadeIn())。
audioSource.clip = audioClipsArray[Random.Range(0, audioClipsArray.Length)]。
audioSource.clip = trimSilence(audioSource.clip);
audioSource.PlayOneShot(audioSource.clip)。
StartCoroutine(FadeOut(audioSource.clip.length - FADE_TIME_SECONDS))。
}
IEnumerator FadeOut(float delay)
{
yield return new WaitForSeconds(delay)。
var timeElapsed = 0;
while (audioSource.volume > 0)
{
audioSource.volume = Mathf.Lerp(1, 0, timeElapsed / FADE_TIME_SECONDS) 。
timeElapsed = Time.deltaTime。
yield return;
}
}
IEnumerator FadeIn()?
{
var timeElapsed = 0;
while (audioSource.volume < 1)
{
audioSource.volume = Mathf.Lerp(0, 1, timeElapsed / FADE_TIME_SECONDS) 。
timeElapsed = Time.deltaTime。
yield return;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312442.html
標籤:
上一篇:我怎樣才能把網路服務的輸出分開?
