Play narration background commentary in Unity

1. Demand

  • The mp3 file is placed in streamingAssets or linked in the url
  • Call method: Play("mp3 name")
  • Use narration background commentary: set the audio source to non-3D mode
  • When the [current commentary] is interrupted to play the [next commentary], there will be a fade-out effect

Two, the code

using System;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using Cysharp.Threading.Tasks;
using System.Collections;

/// <summary>
/// 声音播放,自动添加一个PlayAudio组件,播放声音。适用于旁白背景音的播放-比如解说音
/// audioSource.spatialBlend = 0;  // 将 Spatial Blend 设置为 0,旁白背景声音
/// </summary>
[RequireComponent(typeof(AudioSource))]
public class PlayAudio : MonoBehaviour
{
    
    
    /// <summary>
    /// audioSource:3D声音play组件
    /// </summary>
    public AudioSource audioSource;

    void Start()
    {
    
    
        audioSource = this.GetComponent<AudioSource>();
    }

    /// <summary>
    /// 播放指定的mp3文件
    /// 文件的摆放位置:Application.streamingAssetsPath/mp3/xxxx.mp3
    /// 使用await执行时,会等待该mp3播放完毕
    /// 淡出效果:如果中间要播放另外的mp3声音时,用淡出效果停止当前播放的声音
    /// </summary>
    /// <param name="mp3file">xyz.mp3</param>
    /// <param name="audioSource">audioSource组件</param>
    /// <param name="fadeDuration">淡出停止播放的时间</param>
    /// <returns></returns>
    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;

        //【1】加载资源
        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);
            }
        }

        //【2】播放声音
        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;  // 将 Spatial Blend 设置为 0,旁白背景声音
            audioSource.Play();

            //等待播放完毕
            await UniTask.Delay(TimeSpan.FromSeconds(audioSource.clip.length));
        }
    }

    //获取场景中所有的root物体
#if UNITY_EDITOR
    [ContextMenu("播放声音")]
#endif

    public void PlayTest()
    {
    
    
        audioSource = this.GetComponent<AudioSource>();
        //"123.mp3"
        LoadAudioClipAsync("123.mp3", audioSource);
    }
}

Guess you like

Origin blog.csdn.net/dzj2021/article/details/130324267