Unity的音频

 最近做了项目的音频的播放,总结一下。

主要要熟悉三个东西:

1.AuidoSource

这个是音频的播放器,可以存在多个

(1)AudioClip要播放的音频文件

(2)SpatialBlend 为0是2D音效,为1是3D的音效

(3)play接口默认播放AudioSource的clip属性的音频,如果再次播放另外一个音频,那么会中断之前的播放的音频,播放新的。

(4)PlayOneShot接口要传入一个音频的名字来用于播放,可以多次调用同时播放,不会中断之前的播放,但是你也失去了控制每个音频暂停的权利,只有调用AudioSource的stop来暂停所有正在播放的音频。

(5)如果要播放多个音频,建议一个音频对应一个AudioSouce播放器,这样更好控制,我们游戏中也是这样实现的。

 

 

2.AudioListener

这个是音频的接受器,应该保持整个游戏中只存在一个!!

1.播放2D音频的时候可以放在任何位置,但是播放3D音频的时候我们就要放在特定位置了

2.最好我们的音频管理器自己管理一个对象然后将AudioListener挂上去,这个对象的生命期由我们自己掌握,因为挂其他对象上会牵扯进其他系统的逻辑,如果对应的AudioListener的obj被销毁了,那么我们将听不到声音。

 

 

3.AudioClip

这个是音频资源,支持ogg,mp3等格式, 游戏中我们把资源打包成了AB来进行加载

 

 

4.音频压缩

下文原链接:这里哦

官方文档:点击打开链接

 

使用声音文件时考虑以下建议:

对于音乐和(或)环境声(Ambient Sounds):

存储在长音频剪辑剪辑(Audio Clips)中的音乐会占据大量内存,您有两种选择:

  • 使用流(Streaming)载入方式(Load Type),并且设置压缩格式(Compression Format)为Vorbis。如此设置即可使内存使用量减至最低,但相对的会占用更多CPU资源和I/O吞吐量。
  • 使用压缩并存储至内存(Compressed In Memory)载入方式,设置压缩格式为Vorbis。与第一个方案唯一的区别是,前者占据更多I/O吞吐,而此种方式占用更多内存。注意,您可以调整Quality滑块来通过降低音频质量来减小音频剪辑压缩后的尺寸。一般来说,100%的Quality值略高,我们推荐70%。注意,使用该种设置添加两个以上的音乐或环境声剪辑时会大量消耗CPU。

音效通常是短或中等长度的音频剪辑,它们的播放频率可能很高,也可能很低。对于这些可能的情况,使用时请参考如下规则:

  • 对于经常播放的短音频剪辑,使用载入时压缩(Decompress On Load)载入方式(Load Type),PCM或ADPCM压缩格式(Compression Format)。选择PCM时,播放无需解压,适用于短且使用频率高的音频剪辑。您也可以用ADPCM压缩格式,播放该格式需要解压缩,但解压缩ADPCM比Vorbis快很多。
  • 对于经常播放的中等长度剪辑,使用压缩并存储至内存(Compressed In Memory)和ADPCM压缩格式(Compression Format)。原始PCM的大小大概是ADPCM的3.5倍,ADPCM的解压缩算法也比Vorbis解压缩算法占用更少CPU。
  • 对于播放频率低的短音频剪辑,使用压缩并存储至内存(Compressed In Memory)和ADPCM压缩格式(Compression Format),理由同2。
  • 对于播放频率低的中等长度剪辑,使用压缩并存储至内存(Compressed In Memory)和Vorbis压缩格式(Compression Format)。使用ADPCM处理该种声音效果(SFX)未免显得浪费了存储空间,况且播放的频率又很低,所以使用更多CPU资源解压缩还是可以接受的。

 

 

 

5.实现

using AssetLoad;
using System;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    private int mID = 0;
    private float mUpdateDelta = 0;

    private GameObject mAudioListenerObj;
    private AudioListener mAudioListener;
    //AudioListener跟随对象
    private GameObject mAudioListenerFollowObj;
    //缓存当前帧数
    private int mCurFrameCount;
    //当前帧播放列表
    private List<string> mCurFramePlayList = new List<string>();

    //指定音频类型的音频数据
    private Dictionary<string, AudioTypeData> mAudioTypeDataDict = new Dictionary<string, AudioTypeData>();

    private static AudioManager mInstance;
    public static AudioManager Instance
    {
        get
        {
            if (mInstance == null)
            {
                GameObject obj = new GameObject();
                obj.name = "AudioManager";
                mInstance = obj.AddComponent<AudioManager>();
                mInstance.I
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值