Unity中播放旁白背景解说

一、需求

  • mp3文件放置在streamingAssets或者链接在url里
  • 调用方式:Play(“mp3名字”)
  • 采用旁白背景解说方式:设置音源为非3D模式
  • 中断【当前解说音】去播放【下一条解说音】的时候,有淡出效果

二、代码

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);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值