//获取播放器 private AudioData GetAudioSource(string type, AudioSpaceType spaceType, AudioCreateType createType, AudioReleaseType releaseType, GameObject targetObj, float maxRange, bool isLoop) { //获取指定type的数据 AudioTypeData data = GetAudioTypeData(type); //获取播放器 AudioData audioData = null; //寻找空闲播放器 bool bFree = false; for (int i = 0; i < data.mAudioDataList.Count; i++) { if (createType == AudioCreateType.eOnly) { if (data.mAudioDataList[i].mCreateType == createType) { bFree = true; audioData = data.mAudioDataList[i]; if (audioData.mAudioState == AudioSourceState.ePlaying) { StopAndDisposeAudioByID(audioData.mID); audioData.mAudioState = AudioSourceState.eReady; } break; } } else if (createType == AudioCreateType.eNew) { if (!data.mAudioDataList[i].mAudioSource.isPlaying && data.mAudioDataList[i].mAudioState == AudioSourceState.eIdel && data.mAudioDataList[i].mSpaceType == spaceType && data.mAudioDataList[i].mCreateType == createType) { bFree = true; audioData = data.mAudioDataList[i]; audioData.mAudioState = AudioSourceState.eReady; audioData.mFollowObj = targetObj; audioData.mAudioSource.loop = isLoop; audioData.mAudioSource.maxDistance = maxRange; break; } } } //没有空闲,创建新的 if (!bFree) { audioData = CreateAudioData(type, spaceType, createType, releaseType, data, targetObj, maxRange, isLoop); data.mAudioDataList.Add(audioData); mAudioDataMap[audioData.mID] = audioData; } return(audioData); }
private AudioSource GetAudioSource(string name, AudioCreateType audioCreateType, GameObject fromPosition, bool loop, float e3d = 0f, float maxRange = 0f) { AudioClip clip = Resources.Load <AudioClip>("Music/" + name); if (audioCreateType == AudioCreateType.ONLY) { if (bgm == null) { bgm = fromPosition.AddComponent <AudioSource>(); } else { if (bgm.isPlaying) { bgm.Stop(); } } bgm.clip = clip; bgm.spatialBlend = e3d; bgm.loop = loop; return(bgm); } else { bool bFree = false; int i; for (i = 0; i < mID; ++i) { if (!sounds[i].isPlaying) { bFree = true; break; } } if (!bFree) { AudioSource newSource = fromPosition.AddComponent <AudioSource>(); sounds.Add(newSource); mID++; } sounds[i].clip = clip; sounds[i].loop = loop; sounds[i].spatialBlend = e3d; sounds[i].maxDistance = maxRange; sounds[i].transform.position = fromPosition.transform.position; return(sounds[i]); } }
//创建播放器(新增类型要修改这里) private AudioData CreateAudioData(string type, AudioSpaceType spaceType, AudioCreateType createType, AudioReleaseType releaseType, AudioTypeData data, GameObject targetObj, float maxRange, bool isLoop) { AudioData audioData = new AudioData(); audioData.mID = mID++; audioData.mFollowObj = targetObj; audioData.mTimerID = 0; audioData.mAudioState = AudioSourceState.eReady; audioData.mType = type; audioData.mSpaceType = spaceType; audioData.mCreateType = createType; audioData.mReleaseType = releaseType; audioData.mLoop = isLoop; audioData.mMaxRange = maxRange; GameObject obj = new GameObject(); obj.transform.SetParent(transform, false); obj.name = type.ToString() + audioData.mID; audioData.mAudioSource = obj.AddComponent <AudioSource>(); audioData.mAudioSource.mute = data.IsMute; audioData.mAudioSource.volume = data.Volume; if (spaceType == AudioSpaceType.e2D) { audioData.mAudioSource.spatialBlend = 0.0f; audioData.mAudioSource.loop = isLoop; } else if (spaceType == AudioSpaceType.e3D) { audioData.mAudioSource.spatialBlend = 1.0f; audioData.mAudioSource.maxDistance = maxRange; audioData.mAudioSource.minDistance = 0; audioData.mAudioSource.loop = isLoop; audioData.mAudioSource.rolloffMode = AudioRolloffMode.Linear; if (targetObj != null) { obj.transform.position = targetObj.transform.position; } } return(audioData); }
//播放音效 //type 音频类型 //spaceType 空间类型(2D或者3D) //createType 创建类型(eOnly:唯一播放器 eNew : 多个播放器) //name 音频名字 //delayTime 延时时间 //obj 3d音效需要指定obj对象 //maxRange 3D音效的最大范围 //isLoop 是否循环 public int PlayAudio(string type, string name, bool isLoop = false, float delayTime = 0.0f, AudioCreateType createType = AudioCreateType.eOnly, AudioSpaceType spaceType = AudioSpaceType.e2D, AudioReleaseType releaseType = AudioReleaseType.eAuto, GameObject obj = null, float maxRange = 0.0f) { if (string.IsNullOrEmpty(name)) { return(-1); } //获取播放器 AudioData audioData = GetAudioSource(type, spaceType, createType, releaseType, obj, maxRange, isLoop); //加载音频,然后播放音频 GetAudioClip(name, (audioClip) => { if (audioClip == null) { return; } audioData.mAudioSource.clip = audioClip; audioData.mAudioSource.playOnAwake = false; if (Mathf.Abs(delayTime) < Mathf.Epsilon) { audioData.mAudioSource.Play(); audioData.mAudioState = AudioSourceState.ePlaying; } else { audioData.mTimerID = TimerManager.Instance.AddTimer(delayTime, 1, () => { audioData.mAudioSource.Play(); audioData.mAudioState = AudioSourceState.ePlaying; audioData.mTimerID = 0; }); } }); return(audioData.mID); }
//会过滤掉同一帧重复播放的音乐 private void PlayAudioFilter(string type, string name, bool isLoop = false, float delayTime = 0.0f, AudioCreateType createType = AudioCreateType.eOnly, AudioSpaceType spaceType = AudioSpaceType.e2D, AudioReleaseType releaseType = AudioReleaseType.eAuto, GameObject obj = null, float maxRange = 0.0f) { if (mCurFrameCount != Time.frameCount) { mCurFrameCount = Time.frameCount; mCurFramePlayList.Clear(); } else { //阻止同一帧多次播放相同的音频 int index = mCurFramePlayList.FindIndex((item) => { return(item == name); }); if (index != -1) { return; } } PlayAudio(type, name, isLoop, delayTime, createType, spaceType, releaseType, obj, maxRange); }