/// <summary> /// Returns the closest VirtualAudioListener, or null if there isn't one. /// </summary> public VirtualAudioListener GetClosestListener() { List <VirtualAudioListener> listeners = VirtualAudioListener.allListeners; VirtualAudioListener returnListener = null; float minSqrDist = Mathf.Infinity; for (int i = 0; i < listeners.Count; ++i) { if ((transform.position - listeners[i].transform.position).sqrMagnitude < minSqrDist) { minSqrDist = (transform.position - listeners[i].transform.position).sqrMagnitude; returnListener = listeners[i]; } } return(returnListener); }
public override IEnumerator PlayAudioSource(float delay = 0f) { isCoroutinePlaying = true; if (mySource == null) { Debug.LogWarning("No AudioSource assigned to this virtual source! An AudioSource must be assigned for in order to function properly!"); } else if (!mySource.gameObject.activeInHierarchy || !mySource.enabled) { Debug.LogWarning("Cannot play a disabled AudioSource"); } else { do { VirtualAudioListener closestListener = GetClosestListener(); if (closestListener != null) { mySource.PlayDelayed(delay); } if (lockPlayingClipToListener) { while (mySource != null && mySource.isPlaying) { //update audio source by keeping the relative positions / orientations between the closest virtual player and this virtual source the same as between the actual source and true listener if (closestListener != null) { mySource.transform.position = Quaternion.Inverse(closestListener.transform.rotation) * (this.transform.position - closestListener.transform.position) + VirtualAudioListener.sceneAudioListener.transform.position; } else { mySource.Stop(); } yield return(null); } } else { while (mySource != null && mySource.isPlaying) { closestListener = GetClosestListener(); if (closestListener != null) { mySource.transform.position = Quaternion.Inverse(closestListener.transform.rotation) * (this.transform.position - closestListener.transform.position) + VirtualAudioListener.sceneAudioListener.transform.position; } else { mySource.Stop(); } yield return(null); } } }while(loopCoroutine && !pauseAudio && VirtualAudioListener.allListeners.Count > 0 && mySource != null && mySource.gameObject.activeInHierarchy && mySource.enabled); } isCoroutinePlaying = false; }