最近做了项目的音频的播放,总结一下。
主要要熟悉三个东西:
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