音效检查流程-audio importer
总结一下我在现在这个项目里所用的音效检查是如何实现的吧,主要涉及到audio importer的使用。
在Unity中加工具菜单,方便策划美术使用,用的是MenuItem[]
主要的步骤是:
- 拿到项目里所有的音效文件
- 修改其meta文件
具体流程如下:
1. 找到音效文件
Directory.GetFiles(AssetsChecker.AudioRoot, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".wav") || s.EndsWith(".mp3")); //遍历所有root目录底下所有音效文件,并保存在dictionary里
2. 导入音效文件
有几个重要的importer可以了解
- AudioImporter:可以改变AudioClip的importer设置
- AssetImporter:可以改变asset bundle的设置
- TextureImporter: 可以改变texture的设置
AudioImporter importer = AudioImporter.GetAtPath(file) as AudioImporter;
3. 音效标准
LoadType
- Compressed In Memory: 音频剪辑将存储在 RAM 中,播放时将解压缩,播放时不需要额外的存储,但会占用更多内存
- Streaming:音频永久存在设备上 (硬盘或闪存上) ,播放流媒体方式。不需要 RAM 进行存储或播放,但是会占占用更多的CPU资源和I/O吞吐量
- Decompress On Load: 未压缩的音频将存储在 RAM 中。这个选项需要的内存最多,但是播放它不会像其他选项那样需要太多的 CPU 电源
CompressionType
- PCM :提供高品质但牺牲文件大小最适合使用在很短的音效上,因为无需解压
- ADPCM: 这种格式适用于大量音效上如脚步爆破和武器,需要解压,但解压速度比vorbis快很多,内存占用它比 PCM 小 3.5 倍
- Vorbis/MP3: 比 PCM 小但是品质比 PCM 低,比 ADPCM 消耗更多 CPU。但大多数情况下我们还是应该使用这种格式。
建议:小文件音频建议使用预加载,大文件音频建议使用将 Load Type 修改为 Streaming , 这样在播放完毕后会自动释放对应文件。
在我们项目中都统一成一种类型,目的就是为了减少内存
- 压缩格式都为Vorbis
- loadType都是Streaming
- Enable forceToMono:没有双声道的需求,所以都设置为单声道
AudioImporterSampleSetting
This structure contains a collection of settings used to define how an AudioClip should be imported.
This structure is used with the AudioImporter to define how the AudioClip should be imported and treated during loading within the Scene.
AudioImporterSampleSettings sampleSettings = new AudioImporterSampleSettings(); ampleSettings.loadType = AudioClipLoadType.Streaming; sampleSettings.compressionFormat = AudioCompressionFormat.Vorbis; ampleSettings.quality = importer.defaultSampleSettings.quality; sampleSettings.sampleRateSetting = importer.defaultSampleSettings.sampleRateSetting; sampleSettings.sampleRateOverride = importer.defaultSampleSettings.sampleRateOverride; sampleSettings.conversionMode = importer.defaultSampleSettings.conversionMode;
4. 音效的meta文件里面的设置就会被相应改变
资源加载另一种方式
- 加载:举例texture2D:Texture2D image = AssetDatabase.LoadAssetAtPath(ssss, typeOf(Texture2D)) as Texture2D
- EditorUtility.SetDirty()函数来标记已被修改的资源,
- 然后调用AssetDatabase.SaveAssets()来保存修改。
- 调用Resources.UnloadAsset()来清理资源时,只是标记该资源需要被GC回收,但不是立刻就被回收的。
Reference:
- https://www.tamsiree.com/Software/Unity/Unity%E9%9F%B3%E9%A2%91%E5%8E%8B%E7%BC%A9%E4%BC%98%E5%8C%96/#%E6%AD%A3%E6%96%87
- https://blog.csdn.net/qq_18995513/article/details/51955609
- https://docs.unity3d.com/Manual/class-AudioClip.html