Unity 基础 之 导入资源(音频)时进行自动设置一些属性(简单根据导入音频的数据进行设置)
目录
Unity 基础 之 导入资源(音频)时进行自动设置一些属性(简单根据导入音频的数据进行设置)
一、简单介绍
Unity中的一些基础知识点。
本节简单介绍 Unity 导入音频的自动进行一些相关设置,便于一些常用的批量操作,如果你有新的方式也可以留言,多谢。
Unity的音频会成为内存杀手,在实际的商业项目中,音频的优化必不可少。
1. Unity支持许多不同的音频格式,但最终它将它们全部转换为首选格式。音频压缩格式有PCM、ADPCM、Vorbis,不是所有平台都支持这些所有的压缩格式,有些平台,例如WebGL只支持AAC格式。
2.所有音频导入时,默认两项设置,LoadType是"Decompress On Load",压缩格式是“Vorbis”,例如下图原始文件大小计算为35.9 MB,导入的大小计算为10.7 MB。这意味着这个音频剪辑将使您的游戏(存档)大小增加10兆字节,但播放它需要近36兆字节的RAM。
Force To Mono:将多声道音频混合为单声道
Load In Background:多线程加载音频
Ambisonic:是否环绕声
Load Type:加载方式
Decompress On Load:在音频加载后马上解压缩。对较小的压缩声音使用此选项可以避免动态解压缩的性能开销,不过在加载时解压缩Vorbis编码的声音将使用大约十倍于内存的内存(对于ADPCM编码约为3.5倍),因此请勿对大文件使用此选项。
Compressed In Memory:将声音压缩在内存中并在播放时解压缩。 此选项具有轻微的性能开销(特别是对于Ogg / Vorbis压缩文件),因此仅将其用于加载时解压缩将使用大量内存的较大的文件。 解压缩发生在混音器线程上,可以在探查器窗口的音频窗格中的"DSP CPU"部分进行监视。
Streaming:动态解码声音。 此方法使用最少量的内存来缓冲从磁盘中逐步读取并在运行中解码的压缩数据。 解压缩发生在单独的流线程上,可以在Profiler窗口的音频窗格的"Streaming CPU"部分中监视其CPU使用情况。 即使没有加载任何音频数据,Streaming的剪辑也有大约200KB的消耗。
Preload Audio Data:预加载
Compression Format:指定音频在运行时的格式
PCM:此选项以更大的文件大小为代价提供更高的质量,并且最适合非常短的声音效果。
ADPCM:这种格式对于包含大量噪音且需要大量播放的声音非常有用,例如脚步声,撞击声,武器。 压缩比是PCM的3.5倍,而且CPU使用率远低于MP3 / Vorbis格式,这使其成为上述类别声音的首选。
Vorbis/MP3:压缩为较小的文件,但与PCM音频相比质量稍低。 压缩量可通过"质量"滑块进行配置。 此格式最适合中等长度的音效和音乐。
Sample Rate Setting: 采样率设置
Preserve Sample Rate: 保留采样率
Optimize Sample Rate:此设置根据分析的最高频率内容自动优化采样率。
Override Sample Rate:此设置允许手动覆盖采样率,因此可以有效地避免采样内容丢失。
长音频播放消耗大量内存,如果播放时不想在内存中进行解压,有两个选择(仅供参考):
(1)Load Type选“Streaming”, Compression Format 选”Vorbis",使用最少的内存,但需要更多的CPU电量和硬盘I/O操作;
(2)Load Type选“Compressed In Memory”, Compression Format 选”Vorbis",磁盘I/O操作被替换成内存的消耗,请注意,要调整“Quaility”滑块以减小压缩剪辑的大小,以交换音质,一般推荐70%左右。
一般是看到底音乐占据多少内存以及你的目标机型是什么样子的,如果音乐占据的内存本身比较高,你的目标机型的内存又比较小,那么就选择第二种,这种方案会卡一点,否则选择第一种就更好
声音特效,怎么设置(仅供参考):
(1)对于经常播放的和短的音频剪辑,使用“Decompress On Load”和“PCM或ADPCM"压缩格式。当选择PCM时,不需要解压缩,如果音频剪辑很短,它将很快加载。你也可以使用ADPCM。它需要解压,但解压比Vorbis快得多。
(2)对于经常播放,中等大小的音频剪辑使用”Compressed In Memory“和”ADPCM“压缩格式,比原始PCM小3.5倍,解压算法的CPU消耗量不会像vorbis消耗那么多CPU。
(3)对于很少播放并且长度比较短的声音剪辑,使用”Compressed In Memory", ADPCM 这种压缩格式,原因同(2)。
(4)对于很少播放中等大小的音频,使用”Compressed In Memory“ 和Vorbis压缩格式。这个音频可能太长,无法使用adpcm存储,播放太少,因此解压缩所需的额外CPU电量不会太多。
二、实现原理
1、继承 AssetPostprocessor 类,在资源导入的时候自动进行一些需要的简单设置
可以参考官网学习更更多:https://docs.unity3d.com/cn/current/ScriptReference/AssetPostprocessor.html
2、实现函数 private void OnPostprocessAudio(AudioClip clip) 即可,进行相关音频文件导入自动设置
可以参考官网学习更更多:https://docs.unity3d.com/cn/current/ScriptReference/AudioClip.html
三、注意事项
1、当然根据 AssetPostprocessor 提供的接口,我们可以不仅是音频导入进行简单的一些设置,其他的导入资源同样也是可以类似操作的
四、效果预览
五、实现步骤
1、打开 Unity,新建一个空工程
2、在工程中新建一个脚本 Editor ,再添加一个脚本,编写代码实现图片音频时,进行一些简单的设置使用,这里简单根据音频的长度,进行演示性相关设置
3、把音频文件导入进工程中
4、查看导入音频,会发现不同的音频,自动进行了不同设置
六、关键代码
/****************************************************
文件:AudioImportAutoSetting.cs
作者:仙魁 X-AN
博客:https://blog.csdn.net/u014361280
日期:2021/04/25 16:15:19
功能:音频文件导入自动设置一些属性
*****************************************************/
using UnityEngine;
using UnityEditor;
namespace Study_XAN {
public class AudioImportAutoSetting : AssetPostprocessor
{
// 导入音频时
private void OnPostprocessAudio(AudioClip clip) {
var audio = (AudioImporter)assetImporter;
AudioImporterSampleSettings settings = new AudioImporterSampleSettings();
// 这里根据音量的时间长度演示 导入音频时自动设置的情况,大家可以根据需要自行更改即可
// 音频时间长度小于 1 秒
if (clip.length < 1)
{
settings.loadType = AudioClipLoadType.DecompressOnLoad;
}
else if(clip.length < 3 ) // 音频时间长度大于 1 秒 ,小于 3 秒
{
settings.loadType = AudioClipLoadType.CompressedInMemory;
}
else
{ // 音频时间长度大于 3 秒
settings.loadType = AudioClipLoadType.Streaming;
}
// 进行设置
audio.defaultSampleSettings = settings;
// 预载音频数据为 false
audio.preloadAudioData = false;
}
}
}
七、参考资料
1)https://blog.csdn.net/u013244147/article/details/104585279/
2)https://www.cnblogs.com/bearhb/p/11210136.html