虽然我们的游戏是3D游戏,但是音效却不需要3D音效,因此写音效管理器代码的时候,也就只有简单播放接口,而没有带设置音源对象坐标的接口。
下面的代码只是一个示例,具体使用视具体情况。
示例代码主要就是针对音源AudioSource的重复利用、避免重复加载音频片段AudioClip、开启/关闭音效接口
牛x的网友请勿拍砖,3Q
例如:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 namespace Common 6 { 7 //音效 8 public class SoundManager : Singleton<SoundManager> 9 { 10 //背景音乐 11 //由于背景音乐是常存的,因此不需要运行时动态创建音源对象,直接在编辑中指定好编辑好 12 //如果有多种背景音乐,则可以写一个类似mOtherASList列表的东西(见下面描述) 13 public AudioSource mBackgroundAudio = null; 14 15 //其他音源对象的父对象 16 public GameObject mOtherParentGO = null; 17 18 //是否打开背景音乐(0否, 非0是) 19 private uint mIsOpenMusic = 1;//不使用布尔值是因为在其他地方另做他用 20 public uint IsOpenMusic { get { return mIsOpenMusic; } } 21 22 //是否打开音效(0否,非0是) 23 private uint mIsOpenSoundEffect = 1;//不使用布尔值是因为在其他地方另做他用 24 public uint IsOpenSoundEffect { get { return mIsOpenSoundEffect; } } 25 26 //其他音源 27 private List<AudioSource> mOtherASList = new List<AudioSource>(); 28 29 //已加载进来的音频片段 30 private Dictionary<string, AudioClip> mAudioClipDic = new Dictionary<string, AudioClip>(); 31 32 void Start() 33 { 34 PlayBackgroundMusic(); 35 } 36 37 //设置背景音乐是否打开 38 public void SetBackgroundMusic() 39 { 40 mIsOpenMusic = (uint)(mIsOpenMusic == 0 ? 1 : 0); 41 42 if (mIsOpenMusic != 0) 43 { 44 PlayBackgroundMusic(); 45 } 46 else 47 { 48 //停止播放背景音乐 49 } 50 } 51 52 //设置音效是否打开 53 public void SetSoundEffect() 54 { 55 mIsOpenSoundEffect = (uint)(mIsOpenSoundEffect == 0 ? 1 : 0); 56 } 57 58 //获取音频片段 59 private AudioClip GetAudioClip(string soundName) 60 { 61 AudioClip clip; 62 63 if (!mAudioClipDic.TryGetValue(soundName, out clip)) 64 { 65 clip = AssetsManager.LoadAudioClip(soundName); 66 67 mAudioClipDic.Add(soundName, clip); 68 } 69 70 return clip; 71 } 72 73 private AudioSource GetAudioSource() 74 { 75 foreach (AudioSource audio in mOtherASList) 76 { 77 if (!audio.isPlaying) 78 { 79 return audio; 80 } 81 } 82 83 GameObject go = new GameObject(); 84 85 AudioSource audioSource = go.AddComponent<AudioSource>(); 86 audioSource.playOnAwake = false; 87 88 //使新创建的对象是mOtherParentGO的子对象,便于查看 89 go.transform.parent = mOtherParentGO.transform; 90 91 mOtherASList.Add(audioSource); 92 93 return audioSource; 94 } 95 96 //播放背景音乐 97 public void PlayBackgroundMusic() 98 { 99 if (mIsOpenMusic != 0 && mBackgroundAudio != null) 100 { 101 mBackgroundAudio.Play(); 102 } 103 } 104 105 //暂停背景音乐 106 public void PauseBackgroundMusic() 107 { 108 if (mIsOpenMusic != 0 && mBackgroundAudio != null) 109 { 110 if (mBackgroundAudio.isPlaying) 111 { 112 mBackgroundAudio.Pause(); 113 } 114 } 115 } 116 117 //播放其他音效 118 //如果是3d音效,参数列表可以加一个Vector3位置坐标,用设置音源GameObj的位置 119 public void PlayOther(string path, float delayTime = 0f) 120 { 121 if (mIsOpenSoundEffect != 0) 122 { 123 AudioSource audioSource = GetAudioSource(); 124 125 audioSource.clip = GetAudioClip(path); 126 127 audioSource.PlayDelayed(delayTime); 128 } 129 } 130 } 131 }
具体的Unity项目工程就不导出了,有点麻烦-_-!
上述有错误的地方麻烦指正,不胜感激~
superlee
转载请注明此出处网址,谢谢