// Member Functions void Awake() { s_cInstance = this; s_activeAudio = new List <ClipInfo>(); m_listener = (AudioListener)FindObjectOfType(typeof(AudioListener)); occludeState = OcclusionState.OCCLUSION_FALSE; }
// Member Functions void Awake() { s_cInstance = this; s_activeAudio = new List<ClipInfo>(); m_listener = (AudioListener) FindObjectOfType(typeof(AudioListener)); occludeState = OcclusionState.OCCLUSION_FALSE; }
void ProcessAudioOcclusion(ClipInfo _audioClip) { //Get the audioListener in the scene Vector3 listenerPos = m_listener.transform.position; Vector3 sourcePos = _audioClip.audioSource.transform.position; int ignoreMask = 3 << 10; ignoreMask = ~ignoreMask; RaycastHit hit; if (Physics.Linecast(sourcePos, listenerPos, out hit, ignoreMask)) { Debug.DrawLine(sourcePos, listenerPos); if (hit.collider.tag != "Listener") { //TODO: //For now, get every conduit in existence GameObject[] conduits = GameObject.FindGameObjectsWithTag("AudioConduit"); bool occlude = true; //Before occluding, raycast from audio source to all nearby audio conduits. foreach (GameObject conduit in conduits) { RaycastHit sourceToConduit; if (Physics.Linecast(sourcePos, conduit.transform.position, out sourceToConduit)) { if (sourceToConduit.collider.tag == "AudioConduit") { //If there is a conduit within sight of the audio source, check whether the listener has line of sight with the same conduit. RaycastHit LinstenerToConduit; if (Physics.Linecast(listenerPos, conduit.transform.position, out LinstenerToConduit)) { if (LinstenerToConduit.collider.tag == "AudioConduit") { Debug.DrawLine(sourcePos, conduit.transform.position, Color.red); Debug.DrawLine(conduit.transform.position, listenerPos, Color.blue); occlude = false; _audioClip.audioSource.volume = _audioClip.defaultVolume / 2; if (occludeState != OcclusionState.OCCLUSION_PARTIAL) { occludeState = OcclusionState.OCCLUSION_PARTIAL; //Debug.Log("Partial Occlusion"); } } } } } } AudioLowPassFilter audioFilter = _audioClip.audioSource.gameObject.GetComponent <AudioLowPassFilter>(); if (occlude) { if (audioFilter == null) { AudioLowPassFilter filter = _audioClip.audioSource.gameObject.AddComponent <AudioLowPassFilter>(); filter.cutoffFrequency = 2000; } _audioClip.audioSource.volume = _audioClip.defaultVolume / 10; if (occludeState != OcclusionState.OCCLUSION_FULL) { occludeState = OcclusionState.OCCLUSION_FULL; //Debug.Log("Full Occlusion. " + hit.collider.gameObject.name + " is blocking audio"); } } } else { if (_audioClip.audioSource.gameObject.GetComponent <AudioLowPassFilter>() != null) { Destroy(_audioClip.audioSource.gameObject.GetComponent <AudioLowPassFilter>()); _audioClip.audioSource.volume = _audioClip.defaultVolume; } if (occludeState != OcclusionState.OCCLUSION_FALSE) { occludeState = OcclusionState.OCCLUSION_FALSE; //Debug.Log("No Occlusion"); } } } }
void ProcessAudioOcclusion(ClipInfo _audioClip) { //Get the audioListener in the scene Vector3 listenerPos = m_listener.transform.position; Vector3 sourcePos = _audioClip.audioSource.transform.position; int ignoreMask = 3 << 10; ignoreMask = ~ignoreMask; RaycastHit hit; if(Physics.Linecast(sourcePos, listenerPos, out hit, ignoreMask)) { Debug.DrawLine( sourcePos, listenerPos); if(hit.collider.tag != "Listener") { //TODO: //For now, get every conduit in existence GameObject[] conduits = GameObject.FindGameObjectsWithTag("AudioConduit"); bool occlude = true; //Before occluding, raycast from audio source to all nearby audio conduits. foreach(GameObject conduit in conduits) { RaycastHit sourceToConduit; if(Physics.Linecast(sourcePos, conduit.transform.position, out sourceToConduit)) { if(sourceToConduit.collider.tag == "AudioConduit") { //If there is a conduit within sight of the audio source, check whether the listener has line of sight with the same conduit. RaycastHit LinstenerToConduit; if(Physics.Linecast(listenerPos, conduit.transform.position, out LinstenerToConduit)) { if(LinstenerToConduit.collider.tag == "AudioConduit") { Debug.DrawLine( sourcePos, conduit.transform.position, Color.red); Debug.DrawLine( conduit.transform.position, listenerPos, Color.blue); occlude = false; _audioClip.audioSource.volume = _audioClip.defaultVolume / 2; if(occludeState != OcclusionState.OCCLUSION_PARTIAL) { occludeState = OcclusionState.OCCLUSION_PARTIAL; //Debug.Log("Partial Occlusion"); } } } } } } AudioLowPassFilter audioFilter = _audioClip.audioSource.gameObject.GetComponent<AudioLowPassFilter>(); if(occlude) { if(audioFilter == null) { AudioLowPassFilter filter =_audioClip.audioSource.gameObject.AddComponent<AudioLowPassFilter>(); filter.cutoffFrequency = 2000; } _audioClip.audioSource.volume = _audioClip.defaultVolume / 10; if(occludeState != OcclusionState.OCCLUSION_FULL) { occludeState = OcclusionState.OCCLUSION_FULL; //Debug.Log("Full Occlusion. " + hit.collider.gameObject.name + " is blocking audio"); } } } else { if(_audioClip.audioSource.gameObject.GetComponent<AudioLowPassFilter>() != null) { Destroy(_audioClip.audioSource.gameObject.GetComponent<AudioLowPassFilter>()); _audioClip.audioSource.volume = _audioClip.defaultVolume; } if(occludeState != OcclusionState.OCCLUSION_FALSE) { occludeState = OcclusionState.OCCLUSION_FALSE; //Debug.Log("No Occlusion"); } } } }