一、需求
- mp3文件放置在streamingAssets或者链接在url里
- 调用方式:Play(“mp3名字”)
- 采用旁白背景解说方式:设置音源为非3D模式
- 中断【当前解说音】去播放【下一条解说音】的时候,有淡出效果
二、代码
using System;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using Cysharp.Threading.Tasks;
using System.Collections;
[RequireComponent(typeof(AudioSource))]
public class PlayAudio : MonoBehaviour
{
public AudioSource audioSource;
void Start()
{
audioSource = this.GetComponent<AudioSource>();
}
public static async UniTask LoadAudioClipAsync(string mp3file, AudioSource audioSource, float fadeDuration = 2f)
{
string url = Application.streamingAssetsPath + "/mp3/" + mp3file;
AudioClip audioClip = null;
float clipLength = 0.0f;
using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG))
{
await www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
Debug.Log(www.error);
}
else
{
audioClip = DownloadHandlerAudioClip.GetContent(www);
}
}
if (audioClip != null)
{
if (audioSource.isPlaying)
{
float startVolume = audioSource.volume;
while (audioSource.volume > 0)
{
audioSource.volume -= startVolume * Time.deltaTime / fadeDuration;
await UniTask.Yield();
}
audioSource.Stop();
audioSource.volume = startVolume;
}
audioSource.clip = audioClip;
audioSource.spatialBlend = 0;
audioSource.Play();
await UniTask.Delay(TimeSpan.FromSeconds(audioSource.clip.length));
}
}
#if UNITY_EDITOR
[ContextMenu("播放声音")]
#endif
public void PlayTest()
{
audioSource = this.GetComponent<AudioSource>();
LoadAudioClipAsync("123.mp3", audioSource);
}
}