如果你是Unity初学者,首先需要弄清楚声音管理如何在Unity中工作的。
为此,你可以参照下面的链接,去了解一下Audio Clips
、Audio Listeners
、AudioSources
的基本操作:https://unity3d.com/learn/tutorials/modules/beginner/audio/audio-sources-and-listeners
using UnityEngine;
public class SoundManager : MonoBehaviour
{
#region BACKGROUND_MUSIC
public AudioClip[] backgroundMusicClipsArray;
public AudioSource backgroundMusicSource;
#endregion
#region SFX_SOUNDS
public AudioClip[] SFXSounds;
public AudioSource SFXAudioSource;
#endregion
#region PUBLIC_METHODS
public void PlayRandomMusic()
{
backgroundMusicSource.clip = backgroundMusicClipsArray[Random.Range(0, backgroundMusicClipsArray.Length)];
backgroundMusicSource.Play();
}
public void PlayRandomSFXSounds()
{
SFXAudioSource.PlayOneShot(SFXSounds[Random.Range(0, SFXSounds.Length)]);
}
#endregion
}
在这里,对于背景音乐和SFX声音(SFX声音就是一点短的音频剪辑,如跳跃的声音(Biu)等)我声明了两个Audio Clip的数组,名字分别为:backgroundMusicClipsArray和 SFXSounds(分别用来存放对应的声音资源)。
也声明了两个AudioSource
类型的成员变量(就是对应的“BackgroundMusic”和“SFX-Sounds”,记得把他们拖到脚本上哦)。
这里有两个名为PlayRandomMusic()
和PlayRandomSFXSounds()
的方法,用于在我们调用该方法时播放随机音乐/声音。然后为对应的Button添加对应的响应事件。把AudioClips的设置全设为默认即可。
现在测试它在编辑器是否能正常工作。
生成Android Build的时候记得把Development Build和Auto Connect Profiler勾选上,如下图所示:
放心伙计,总会有办法解决的!但这里的问题是,
“哪一个是最好的解决方案?”
让我们采取某些措施,并且继续我们的案例去获得答案。
要想更好的理解这一步,可以通过下面链接去了解AudioClips的设置:
http://docs.unity3d.com/Manual/class-AudioClip.html
https://blog.csdn.net/f_957995490/article/details/106627331
现在选择所有的背景音乐资源。
在Inspector中的设置将会如下图所示:
如上图所示,让我们取消Preload Audio Data(预加载音频数据)选项。然后把Override for Android选项勾上,并且设置Load Type为Streaming。
“如果你已经阅读过上面链接里的内容,你可能已经知道我们为什么要这么做了。”
所有Building的步骤都和上面的一样。
你有看到什么不同嘛?
在我这边,我的游戏加载时间从15秒变为了2秒…!这将比原来的加载时间快了5-7倍啊~!!!
不同的设备效果也许会不一样,这将取决于你的CPU和内存,在这里,我使用的手机型号是“Motorola MOTOG2”
现在让我回到Profiler中,你有发现什么改变吗?
Total Audio Memory居然从147.7MB降到了5.8MB!!这便优化了25倍的内存使用啊~!!!
在案例中,我们禁用了预加载音频(Preload Audio Data),因此就没有必要在开始的时候加载所有的音频剪辑,这便减少了加载时间!这将会在需要用到音频的时候才会去加载它。
也许你现在会想,“一旦我加载和使用了所有的音频剪辑,它们会不会占用内存呢?”
你是否还记得我们把Load Type设置为Streaming,音频剪辑将放入缓存区中,并且从缓存区中播放,一旦播放完后,便被卸载掉,这便释放了内存。因此便优化了内存的使用。
你可能会有另一个问题,“为什么不为SFX声音做同样的操作呢?”
因为SFX声音在游戏运行中会经常使用到,因此会有一点小延迟是无关紧要的。事实上,我推荐将Load Type设置为Decompress on Load(在加载时解压)会运行的更流畅(并不是使用于任何的音频,只是使用于频繁使用的音频)。
无论如何,哪怕你有50个SFX Sounds,只要它不占用10-20MB的内存,那么还是可以接受的。
下图中显示了40个Load Type设置为Decompress on Load的SFX AudioClips的Total Audio Memory仍然为16MB,这对于我来说已经很不错了!!
是的,这是必须滴。如果我们能适当的优化声音资源,我们为在游戏运行中其他重要的资源留下了大量的内存资源,这便创建了一个流程的手机游戏。所以适当的优化和设置是必须的。
原文链接:https://mp.weixin.qq.com/s?__biz=MzI1MzE0MDg3Nw==&mid=2651812879&idx=1&sn=e33d36a35f9d0473b5816777e3e524da&scene=0#wechat_redirect