示例#1
0
    /// <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);
    }
示例#2
0
    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;
    }