Beispiel #1
0
    // Member Functions

    void Awake()
    {
        s_cInstance = this;

        s_activeAudio = new List <ClipInfo>();
        m_listener    = (AudioListener)FindObjectOfType(typeof(AudioListener));

        occludeState = OcclusionState.OCCLUSION_FALSE;
    }
Beispiel #2
0
	// Member Functions
	
	void Awake() 
	{
		s_cInstance = this;
       		
		s_activeAudio = new List<ClipInfo>();
		m_listener = (AudioListener) FindObjectOfType(typeof(AudioListener));
		
		occludeState = OcclusionState.OCCLUSION_FALSE;
    }
Beispiel #3
0
    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");
                }
            }
        }
    }
Beispiel #4
0
	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");
				}	
			}
					 
		}
	}