//3D 音效按优先级和距离排序 private int AudioSourceComparison(EffectAudioSourceItem a, EffectAudioSourceItem b) { // 是否在播放中 if (!a.IsPlaying() && b.IsPlaying()) { return(-1); } else if (a.IsPlaying() && !b.IsPlaying()) { return(1); } else if (a.IsPlaying() && b.IsPlaying()) { // 按照播放优先级, 小在前 if (a.priority != b.priority) { return(a.priority > b.priority ? 1 : -1); } // 按照距离远近 return(DistanceComparison(a.attachedObj.transform.position, b.attachedObj.transform.position)); } return(0); }
public string Play3DNpcShout(string audioName, Vector3 pos, int sortId = 0, bool isLoop = false) { if (IsNpcVoicePlaying()) { return(string.Empty); } string eventName = Util.FixPathString(audioName); #if LOG_WWISE && UNITY_EDITOR Common.HobaDebuger.LogWarningFormat("[UnityAudio] Playing [Wwise] Event: {0}", eventName); #endif // if (string.IsNullOrEmpty(eventName)) // { // for (var i = 0; i < _npcShout3DAndioSourceList.Count; ++i) // { // UpdateAudioState(_npcShout3DAndioSourceList[i], PlayState.Stop, false); // } // return string.Empty; // } EffectAudioSourceItem item = _PlaySFX(eventName, AudioType.S3D, null, pos, sortId, EffectSoundType.NpcShout3D); return(item != null ? item.playingId : string.Empty); }
public void Reset() { _BgmSoundEntry.Reset(); _EnvironmentSoundEntry.Reset(); _WeatherSoundEntry.Reset(); { int nCount = _effectAudioSourceList.Count; for (int i = 0; i < nCount; ++i) { EffectAudioSourceItem item = _effectAudioSourceList[i]; if (item.audioSource != null) { // if(item.audioSource.isPlaying) item.audioSource.Stop(); GameObject.Destroy(item.audioSource.gameObject); item.audioSource = null; } item.Reset(); } _effectAudioSourceList.Clear(); } _ClipCache.Clear(); CheckAudioListener(); }
private int AudioSourceComparison2D(EffectAudioSourceItem a, EffectAudioSourceItem b) { // 是否在播放中 if (!a.IsPlaying() && b.IsPlaying()) { return(-1); } else if (a.IsPlaying() && !b.IsPlaying()) { return(1); } else if (a.IsPlaying() && b.IsPlaying()) { // 按照播放优先级, 小在前 if (a.priority != b.priority) { return(a.priority > b.priority ? 1 : -1); } // 按照距离远近 return(0); } return(0); }
public void Stop3DAudio(string audioName, string audio_source) { if (string.IsNullOrEmpty(audioName)) { return; } string eventName = Util.FixPathString(audioName); for (int i = 0; i < _effect3DAudioSourceList.Count; ++i) { EffectAudioSourceItem item = _effect3DAudioSourceList[i]; if (item.attachedObj != null && (string.IsNullOrEmpty(audio_source) || item.playingId == audio_source)) { if (eventName == item.audioName) { UpdateAudioState(item, PlayState.Stop, item.HaveSwitch()); } } } for (int i = 0; i < _attachedEffect3DAudioSourceList.Count; ++i) { EffectAudioSourceItem item = _attachedEffect3DAudioSourceList[i]; if (item.attachedObj != null && (string.IsNullOrEmpty(audio_source) || item.playingId == audio_source)) { if (eventName == item.audioName) { UpdateAudioState(item, PlayState.Stop, item.HaveSwitch()); } } } }
public void Stop2DAudio(string audioName, string audio_source) { if (string.IsNullOrEmpty(audioName)) { return; } for (int i = 0; i < _effectAudioSourceList.Count; ++i) { EffectAudioSourceItem item = _effectAudioSourceList[i]; AudioSource audioSource = item.audioSource; if (audioSource != null && (string.IsNullOrEmpty(audio_source) || audioSource.name == audio_source)) { if (audioName == item.audioName) { if (item.isLoading == 1) { item.isLoading = 0; } else { UpdateAudioState(item, PlayState.Pause); } break; } } } }
private void UpdateAudioState(EffectAudioSourceItem item, PlayState ps, bool useSwitch) { if (item == null) { return; } if (ps == PlayState.Resume) { if (item.attachedObj != null && !item.IsPlaying()) { if (useSwitch) { item.PlayWithSwitch(item.audioName, item.switchGroup, item.switchState); } else { item.Play(item.audioName); } } } else if (ps == PlayState.Stop || ps == PlayState.Pause) { if (item.attachedObj != null) { item.Stop(); } } }
//3D 音效按优先级和距离排序 private int AudioSourceComparison(EffectAudioSourceItem a, EffectAudioSourceItem b) { if (a.isLoading != b.isLoading) { return(a.isLoading > b.isLoading ? 1 : -1); } // 是否在播放中 if (!a.audioSource.isPlaying && b.audioSource.isPlaying) { return(-1); } else if (a.audioSource.isPlaying && !b.audioSource.isPlaying) { return(1); } else if (a.audioSource.isPlaying && b.audioSource.isPlaying) { // 按照播放优先级, 小在前 if (a.priority != b.priority) { return(a.priority > b.priority ? 1 : -1); } // 按照距离远近 return(DistanceComparison(a.audioSource.transform.position, b.audioSource.transform.position)); } return(0); }
//更新播放状态 private void UpdateAudioState(EffectAudioSourceItem item, PlayState ps) { if (item == null) { return; } if (ps == PlayState.Resume) { if (item.audioSource != null && !item.audioSource.isPlaying) { item.audioSource.Play(); } } else if (ps == PlayState.Stop || ps == PlayState.Pause) { if (item.audioSource != null && item.audioSource.isPlaying) { item.audioSource.Stop(); if (ps == PlayState.Stop) { _ClipCache.Remove(item.audioName); item.audioSource.clip = null; } } } }
public void OnWorldRelease() { _IsInWorld = false; List <EffectAudioSourceItem>[] effectSoundListArray = { _effect3DAudioSourceList, _attachedEffect3DAudioSourceList, _effect2DAudioSourceList, _footStep3DAudioSourceList, _static3DAudioSourceList, _npcVoice3DAudioSourceList, _npcShout3DAndioSourceList, _heartbeat2DAudioSourceList }; for (int n = 0; n < effectSoundListArray.Length; ++n) { List <EffectAudioSourceItem> soundList = effectSoundListArray[n]; int nCount = soundList.Count; for (int i = 0; i < nCount; ++i) { EffectAudioSourceItem item = soundList[i]; if (item.attachedObj != null) { item.Stop(); } } } }
//按优先级及距离获取可用的Channel private EffectAudioSourceItem GetUsableItem(AudioType aType, int priority, Vector3 pos) { if (_effectAudioSourceList.Count > 0) { EffectAudioSourceItem item = GetFirstItem(_effectAudioSourceList); if (item != null && item.isLoading == 0) { if (item.audioSource != null && item.audioSource.isPlaying) { if (item.priority > priority) { return(null); } else if (item.priority == priority && aType == AudioType.S3D) { if (DistanceComparison(item.audioSource.transform.position, pos) > 0) { return(null); } } } return(item); } } return(null); }
private EffectAudioSourceItem GetFirstItem(List <EffectAudioSourceItem> soundList, bool b3D) { if (soundList == null || soundList.Count <= 0) { return(null); } //选一个最小项 EffectAudioSourceItem item = soundList[0]; if (b3D) { for (int i = 1; i < soundList.Count; ++i) { if (AudioSourceComparison(item, soundList[i]) > 0) { item = soundList[i]; } } } else { for (int i = 1; i < soundList.Count; ++i) { if (AudioSourceComparison2D(item, soundList[i]) > 0) { item = soundList[i]; } } } return(item); }
private EffectAudioSourceItem _PlaySFX(string audioName, AudioType aType, Transform point, Vector3 pos, int sortId, EffectSoundType type) { if (string.IsNullOrEmpty(audioName)) { return(null); } if (_IsEffectAudioEnabled) { CheckAudioListener(); SafeInitSFX(); EffectAudioSourceItem item_arranged = GetUsableItem(aType, sortId, pos, type); if (item_arranged != null) { item_arranged.audioName = audioName; if (item_arranged.id != -1 && item_arranged.attachedObj != null) { if (type == EffectSoundType.Effect3D || type == EffectSoundType.AttachEffect3D || type == EffectSoundType.Effect2D || type == EffectSoundType.FootStep3D) { if (item_arranged.IsPlaying()) { item_arranged.Stop(); } } else { item_arranged.Stop(); } GetProperSettingOfItem(item_arranged, aType, audioName, sortId); if (aType == AudioType.AttS3D) { item_arranged.attachedPos = point; item_arranged.attachedObj.transform.position = point.position; } if (aType == AudioType.S3D) { item_arranged.attachedObj.transform.position = pos; } if (item_arranged.attachedObj != null) { item_arranged.Play(audioName); } return(item_arranged); } } } return(null); }
public string Play2DAudio(string audioName, int sortId = 0, bool isLoop = false) { string eventName = Util.FixPathString(audioName); #if LOG_WWISE && UNITY_EDITOR Common.HobaDebuger.LogWarningFormat("[UnityAudio] Playing [Wwise] Event: {0}", eventName); #endif EffectAudioSourceItem item = _PlaySFX(eventName, AudioType.S2D, null, Vector3.zero, sortId, EffectSoundType.Effect2D); return(item != null ? item.playingId : string.Empty); }
public string PlayFootStepAudio(string audioName, Vector3 pos, int sortId = 0, bool isLoop = false) { string eventName = audioName; #if LOG_WWISE && UNITY_EDITOR Common.HobaDebuger.LogWarningFormat("[UnityAudio] Playing [Wwise] Event: {0}", eventName); #endif EffectAudioSourceItem item = _PlaySFX(eventName, AudioType.S3D, null, pos, sortId, EffectSoundType.FootStep3D); return(item != null ? item.playingId : string.Empty); }
public string Play2DAudio(string audioName, int sortId = 0, bool isLoop = false) { if (CUnityUtil.IsWwiseAudioName(audioName)) { return(string.Empty); } EffectAudioSourceItem item = _PlaySFX(audioName, AudioType.S2D, null, Vector3.zero, sortId, isLoop); return(item != null && item.audioSource != null ? item.audioSource.name : string.Empty); }
private bool IsStaticAudioPlaying(string audioName) { for (int i = 0; i < _static3DAudioSourceList.Count; ++i) { EffectAudioSourceItem item = _static3DAudioSourceList[i]; if (item.audioName == audioName && item.IsPlaying()) { return(true); } } return(false); }
private void UpdateSoundPos() { int nCount = _attachedEffect3DAudioSourceList.Count; for (int i = 0; i < nCount; ++i) { EffectAudioSourceItem item = _attachedEffect3DAudioSourceList[i]; if (item.attachedObj != null && null != item.attachedPos) { item.attachedObj.transform.position = item.attachedPos.position; } } }
private void GetProperSettingOfItem(EffectAudioSourceItem item, AudioType aType, string audioName, int priority = 0) { if (item != null && !string.IsNullOrEmpty(audioName)) { item.audioName = audioName; item.priority = priority; item.attachedPos = null; if (item.attachedObj != null) { item.attachedObj.transform.localPosition = Vector3.zero; } } }
private void BgmEventCallback(object in_cookie, AkCallbackType in_type, AkCallbackInfo in_info) { EffectAudioSourceItem item = in_cookie as EffectAudioSourceItem; if (in_type == AkCallbackType.AK_EndOfEvent) { item.playingId = string.Empty; if (this == WwiseSoundMan.Instance.BGEffectAudioItem) { WwiseSoundMan.Instance.BGEffectAudioItem = null; } } }
private void GetProperSettingOfItem(EffectAudioSourceItem item, AudioType aType, AudioClip audioClip, string audioName, int priority = 0, bool IsLoop = false) { //if (audioClip.name.Contains("Battle01")) //{ // Debug.Log("aType " + aType); //} if (item != null && audioClip != null) { if (aType == AudioType.AttS3D || aType == AudioType.S2D || aType == AudioType.S3D) { AudioSource audioSource = item.audioSource; if (audioSource != null) { /* * if (audioSource.clip != null && _ClipCache != null && !string.IsNullOrEmpty(item.audioName) && _ClipCache.ContainsKey(item.audioName)) * { * var curClip = _ClipCache[item.audioName]; * //Destroy(curClip); * _ClipCache.Remove(item.audioName); * } */ item.audioName = audioName; item.priority = priority; item.attachedPos = null; if (audioSource.isPlaying) { audioSource.Stop(); } //audioSource.transform.position = Vector3.zero; audioSource.transform.localPosition = Vector3.zero; audioSource.clip = audioClip; audioSource.volume = EffectFinalVolume; if (AudioType.S3D == aType || AudioType.AttS3D == aType) { audioSource.spatialBlend = 1f; } else if (aType == AudioType.S2D) { audioSource.spatialBlend = 0f; } audioSource.loop = IsLoop; } } } }
public string Play3DAudio(string audioName, Vector3 pos, int sortId = 0, bool isLoop = false) { if (Main.HostPalyer != null && Util.SquareDistanceH(Main.HostPalyer.position, pos) > MaxEffectAudioDistSqr) { //Common.HobaDebuger.LogErrorFormat("Play3DAudio: {0}", audioName); return(string.Empty); } string eventName = Util.FixPathString(audioName); #if LOG_WWISE && UNITY_EDITOR Common.HobaDebuger.LogWarningFormat("[UnityAudio] Playing [Wwise] Event: {0}", eventName); #endif EffectAudioSourceItem item = _PlaySFX(eventName, AudioType.S3D, null, pos, sortId, EffectSoundType.Effect3D); return(item != null ? item.playingId : string.Empty); }
private void SafeInitSFX() { if (_effectAudioSourceList.Count == 0) { for (int i = 0; i < MaxEffectChannel; ++i) { GameObject go = new GameObject(HobaText.Format("effect{0}", i)); go.transform.parent = transform; AudioSource src = go.AddComponent <AudioSource>(); EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.audioSource = src; m.priority = 0; m.audioSource.minDistance = 10; m.audioSource.maxDistance = 30; _effectAudioSourceList.Add(m); } } }
public void Reset() { _IsLoadingShow = false; _BgmSoundEntry.Reset(); _EnvironmentSoundEntry.Reset(); _WeatherSoundEntry.Reset(); List <EffectAudioSourceItem>[] effectSoundListArray = { _effect3DAudioSourceList, _attachedEffect3DAudioSourceList, _effect2DAudioSourceList, _footStep3DAudioSourceList, _static3DAudioSourceList, _npcVoice3DAudioSourceList, _npcShout3DAndioSourceList, _heartbeat2DAudioSourceList }; for (int n = 0; n < effectSoundListArray.Length; ++n) { List <EffectAudioSourceItem> soundList = effectSoundListArray[n]; int nCount = soundList.Count; for (int i = 0; i < nCount; ++i) { EffectAudioSourceItem item = soundList[i]; if (item.attachedObj != null) { item.Stop(); GameObject.Destroy(item.attachedObj); item.attachedObj = null; } item.Reset(); } soundList.Clear(); } CheckAudioListener(); }
//刷新Attach声源位置 private void UpdateSoundsPos() { //if (_AudioListener == null && Camera.main != null) //{ // _AudioListener = Camera.main.gameObject.GetComponent<AudioListener>(); // if (_AudioListener == null) // _AudioListener = Camera.main.gameObject.AddComponent<AudioListener>(); //} int nCount = _effectAudioSourceList.Count; for (int i = 0; i < nCount; ++i) { EffectAudioSourceItem item = _effectAudioSourceList[i]; if (item.audioSource != null && null != item.attachedPos) { item.audioSource.transform.position = item.attachedPos.position; } } }
public string Play2DHeartBeat(string audioName, int sortId = 0, bool isLoop = false) { string eventName = Util.FixPathString(audioName); #if LOG_WWISE && UNITY_EDITOR Common.HobaDebuger.LogWarningFormat("[UnityAudio] Playing [Wwise] Event: {0}", eventName); #endif if (string.IsNullOrEmpty(eventName)) { for (var i = 0; i < _heartbeat2DAudioSourceList.Count; ++i) { UpdateAudioState(_heartbeat2DAudioSourceList[i], PlayState.Stop, false); } return(string.Empty); } EffectAudioSourceItem item = _PlaySFX(eventName, AudioType.S2D, null, Vector3.zero, sortId, EffectSoundType.Heartbeat2D); return(item != null ? item.playingId : string.Empty); }
private void StopStatic3DAudio(string audioName, string audio_source) { if (string.IsNullOrEmpty(audioName)) { return; } string eventName = audioName; for (int i = 0; i < _static3DAudioSourceList.Count; ++i) { EffectAudioSourceItem item = _static3DAudioSourceList[i]; if (item.attachedObj != null && (string.IsNullOrEmpty(audio_source) || item.playingId == audio_source)) { if (eventName == item.audioName) { UpdateAudioState(item, PlayState.Pause, item.HaveSwitch()); break; } } } }
private void GetProperSettingOfItem(CSoundEntry soundEntry, AudioClip audioClip, string audioName) { EffectAudioSourceItem item = soundEntry.Item; if (item != null) { if (!string.IsNullOrEmpty(item.audioName)) { //AudioClip curClip = _ClipCache[item.audioName]; //Destroy(curClip); _ClipCache.Remove(item.audioName); } AudioSource audioSource = item.audioSource; if (audioSource != null) { audioSource.clip = audioClip; audioSource.loop = true; audioSource.priority = 0; audioSource.volume = 0; } item.audioName = audioName; } }
private void SafeInitSFX() { if (_effect3DAudioSourceList.Count == 0) { for (int i = 0; i < MaxEffect3DChannel; ++i) { GameObject go = new GameObject(HobaText.Format("effect3d{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _effect3DAudioSourceList.Add(m); } } if (_attachedEffect3DAudioSourceList.Count == 0) { for (int i = 0; i < MaxAttachedEffect3DChannel; ++i) { GameObject go = new GameObject(HobaText.Format("attachedeffect3d{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _attachedEffect3DAudioSourceList.Add(m); } } if (_effect2DAudioSourceList.Count == 0) { for (int i = 0; i < MaxEffect2DChannel; ++i) { GameObject go = new GameObject(HobaText.Format("effect2d{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _effect2DAudioSourceList.Add(m); } } if (_static3DAudioSourceList.Count == 0) { for (int i = 0; i < MaxStaticEffectChannel; ++i) { GameObject go = new GameObject(HobaText.Format("static{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _static3DAudioSourceList.Add(m); } } if (_footStep3DAudioSourceList.Count == 0) { for (int i = 0; i < MaxFootStepEffectChannel; ++i) { GameObject go = new GameObject(string.Format("footstep{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _footStep3DAudioSourceList.Add(m); } } if (_npcVoice3DAudioSourceList.Count == 0) { for (int i = 0; i < MaxNpcVoiceEffectChannel; ++i) { GameObject go = new GameObject(string.Format("npcvoice3d{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _npcVoice3DAudioSourceList.Add(m); } } if (_npcShout3DAndioSourceList.Count == 0) { for (int i = 0; i < MaxNpcShoutEffectChannel; ++i) { GameObject go = new GameObject(string.Format("npcshout3d{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _npcShout3DAndioSourceList.Add(m); } } if (_heartbeat2DAudioSourceList.Count == 0) { for (int i = 0; i < MaxHeartBeatEffectChannel; ++i) { GameObject go = new GameObject(string.Format("heartbeat{0}", i)); go.transform.parent = AudioItems.transform; EffectAudioSourceItem m = new EffectAudioSourceItem(); m.id = i; m.attachedObj = go; m.priority = 0; _heartbeat2DAudioSourceList.Add(m); } } }
private EffectAudioSourceItem _PlaySFX(string audioName, AudioType aType, Transform point, Vector3 pos, int sortId, bool isLoop) { if (string.IsNullOrEmpty(audioName)) { return(null); } if (_IsEffectAudioEnabled) { CheckAudioListener(); SafeInitSFX(); if (IsClipCached(audioName)) { //PlayAttachAudio(_ClipCache[audioName], false, trans, audioName, sortId, IsLoop); EffectAudioSourceItem item = GetUsableItem(aType, sortId, pos); if (item != null && item.audioSource != null) { AudioClip clip; LoadCache(audioName, out clip); GetProperSettingOfItem(item, aType, clip, audioName, sortId, isLoop); if (aType == AudioType.AttS3D) { item.attachedPos = point; } if (aType == AudioType.S3D) { item.audioSource.transform.position = pos; } item.audioSource.Play(); return(item); } } else { EffectAudioSourceItem item_arranged = GetUsableItem(aType, sortId, pos); if (item_arranged != null) { Action <UnityEngine.Object> callback = asset => { if (!_IsEffectAudioEnabled || asset == null) { if (item_arranged != null) { item_arranged.isLoading = 0; item_arranged.audioName = ""; } return; } if (item_arranged != null) { if (item_arranged.id != -1 && item_arranged.audioSource != null) { if (item_arranged.isLoading == 1 && audioName == item_arranged.audioName) { //EffectAudioSourceItem item = FindInternalItem(item_arranged); item_arranged.isLoading = 0; GetProperSettingOfItem(item_arranged, aType, asset as AudioClip, audioName, sortId, isLoop); if (aType == AudioType.AttS3D) { item_arranged.attachedPos = point; } if (aType == AudioType.S3D) { item_arranged.audioSource.transform.position = pos; } if (item_arranged.audioSource != null) { item_arranged.audioSource.Play(); } } } item_arranged = null; } }; item_arranged.isLoading = 1; item_arranged.audioName = audioName; //Debug.Log("Ask " + audioName + " " + item_arranged.audioSource.name); CAssetBundleManager.AsyncLoadResource(audioName, callback, false); return(item_arranged); } } } return(null); }