AlphaAI
情多最恨花无语,愁破方知酒有权

虽然我们的游戏是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项目工程就不导出了,有点麻烦-_-!

上述有错误的地方麻烦指正,不胜感激~

posted on 2015-02-10 23:01  AlphaAI  阅读(164)  评论(0)    收藏  举报