using UnityEngine; using System.Linq; using System.Collections; using VA; public class VAUListener : MonoBehaviour { public string listenername = "Listener"; public int maxreverbZones = 2; public string VAAudioRenderer = "MyBinauralArtificialReverb"; private int Listener; private VANet _VA = null; private Quaternion q; private Transform t; private AudioReverbZone[] reverbZones; private float currentArtificialReverberationTime = 0f; private float shadowReverbTime; private VAUAuralizationMode globalAuraMode; public delegate void ReverbTimeChangedDelegate(double reverbTime); public event ReverbTimeChangedDelegate ReverbTimeChanged; public int ID { get { return Listener; } } // Use this for initialization void Start() { _VA = VAUAdapter.VA; Listener = _VA.CreateListener(listenername); listenername += " " + Listener; _VA.SetListenerAuralizationMode(Listener, "all"); Debug.Log("[VAU]" + listenername + " created"); _VA.SetListenerHRIRDataset(Listener, VAUAdapter.DefaultHRIR); SetListenerPositionOrientation(); _VA.SetArtificalReverbarationTime(VAAudioRenderer, 0.3f); reverbZones = FindObjectsOfType(typeof(AudioReverbZone)) as AudioReverbZone[]; globalAuraMode = FindObjectOfType().gameObject.GetComponent(); } void OnEnable() { if (GetComponent() != null) GetComponent().AuraStringChanged += OnListenerAuralizationModeChanged; } // Update is called once per frame void Update () { SetListenerPositionOrientation(); SetActiveReverbZones(); } //uses the View- and Up-Vector to transmit the position of the listener to VA void SetListenerPositionOrientation() { _VA = VAUAdapter.VA; t = GetComponent(); q = t.rotation; Vector3 up = q * Vector3.up; Vector3 view = q * Vector3.forward; Vector3 view_ogl = new Vector3(view.x, view.y, -view.z); Vector3 up_ogl = new Vector3(up.x, up.y, -up.z); _VA.SetListenerPosition(Listener, t.transform.position.x, t.transform.position.y, -t.transform.position.z); _VA.SetListenerOrientationVU(Listener, view_ogl.x, view_ogl.y, view_ogl.z, up_ogl.x, up_ogl.y, up_ogl.z); } void SetActiveReverbZones() { if (reverbZones == null) return; float actReverbTime = 0f; int i = 0; foreach (AudioReverbZone reverbZone in reverbZones) { if (i >= maxreverbZones) break; float actDistance = Vector3.Distance(reverbZone.transform.position, gameObject.transform.position); if ((actDistance < reverbZone.maxDistance)) { if (actDistance > reverbZone.minDistance) { actReverbTime += reverbZone.decayTime * (reverbZone.maxDistance - actDistance) / (reverbZone.maxDistance - reverbZone.minDistance); } else { actReverbTime += reverbZone.decayTime; } i++; } } if (shadowReverbTime == actReverbTime) return; if (actReverbTime < 0.3f) globalAuraMode.DiffuseDecay = false; else globalAuraMode.DiffuseDecay = true; shadowReverbTime = actReverbTime; if (i > 0) actReverbTime /= i; if (ReverbTimeChanged != null) ReverbTimeChanged(actReverbTime); _VA.SetArtificalReverbarationTime(VAAudioRenderer, actReverbTime); } void OnListenerAuralizationModeChanged(string AuraMode) { _VA.SetListenerAuralizationMode(Listener, AuraMode); } void OnDisable() { if (GetComponent() != null) GetComponent().AuraStringChanged -= OnListenerAuralizationModeChanged; } void OnDestroy() { if (_VA.IsConnected()) { _VA.DeleteListener(Listener); } } }