- 用到的包:
using Cysharp.Threading.Tasks;
- 代码:
/// <summary>
/// 播放指定的clip声音,当前有声音在播放,则淡出并停止,然后播放给定的声音
/// 适用场景:有N个button,对应N个clip,点击指定的button播放对应的clip
/// </summary>
/// <param name="myAudioSource">播放组件</param>
/// <param name="clip">播放的片段</param>
/// <param name="ctk">cancellation</param>
/// <param name="fadeOut">淡出效果</param>
/// <param name="fadeDuration">淡出的时间</param>
/// <returns></returns>
public static async UniTask PlayAudio(AudioSource myAudioSource, AudioClip clip,CancellationToken ctk, bool fadeOut,float fadeDuration)
{
//【1】检查当前是否有正在播放的clip
if (myAudioSource.isPlaying)
{
// 声音淡出的判断和处理
if (fadeOut)
{
float startVolume = myAudioSource.volume;
//每帧处理,相当于Update
while (myAudioSource.volume > 0)
{
myAudioSource.volume -= startVolume * Time.deltaTime / fadeDuration;
await UniTask.Yield(ctk);
}
myAudioSource.Stop();
myAudioSource.volume = startVolume;
}
else
{
myAudioSource.Stop();
}
}
//【2】播放新声音
myAudioSource.clip = clip;
myAudioSource.time = 0;
myAudioSource.Play();
}
- 测试
PlayAudio(audioSource,myAudio, this.GetCancellationTokenOnDestroy(),fadeOut:true,fadeDuration:1.0f).Forget();