private void setSlideTargetVolumes(GameObject otherObject, Vector3 relativeVelocity, Vector3 normal, Vector3 contactPoint, bool exit) { //log("Sliding! " + gameObject.name + " against " + otherObject.name + " - Relative Velocity: " + relativeVelocity + ", Normal: " + normal + ", Contact Point: " + contactPoint + ", Exit: " + exit); if (SoundMaterial == null || !this.enabled || SoundMaterial.AudioSets.Count == 0) { return; } PhysSoundMaterial m = null; PhysSoundBase b = otherObject == null ? null : otherObject.GetComponent <PhysSoundBase>(); if (b) { //Special case for sliding against a terrain if (b is PhysSoundTerrain) { PhysSoundTerrain terr = b as PhysSoundTerrain; Dictionary <int, PhysSoundComposition> compDic = terr.GetComposition(contactPoint); foreach (PhysSoundAudioContainer c in _audioContainersDic.Values) { PhysSoundComposition comp; float mod = 0; if (compDic.TryGetValue(c.KeyIndex, out comp)) { mod = comp.GetAverage(); } c.SetTargetVolumeAndPitch(this.gameObject, otherObject, relativeVelocity, normal, exit, mod); } return; } else { m = b.GetPhysSoundMaterial(contactPoint); } } //General cases //If the other object has a PhysSound material if (m) { PhysSoundAudioContainer aud; if (_audioContainersDic.TryGetValue(m.MaterialTypeKey, out aud)) { aud.SetTargetVolumeAndPitch(this.gameObject, otherObject, relativeVelocity, normal, exit); } else if (!SoundMaterial.HasAudioSet(m.MaterialTypeKey) && SoundMaterial.FallbackTypeKey != -1 && _audioContainersDic.TryGetValue(SoundMaterial.FallbackTypeKey, out aud)) { aud.SetTargetVolumeAndPitch(this.gameObject, otherObject, relativeVelocity, normal, exit); } } //If it doesnt we set volumes based on the fallback setting of our material else { PhysSoundAudioContainer aud; if (SoundMaterial.FallbackTypeKey != -1 && _audioContainersDic.TryGetValue(SoundMaterial.FallbackTypeKey, out aud)) { aud.SetTargetVolumeAndPitch(this.gameObject, otherObject, relativeVelocity, normal, exit); } } }
/// <summary> /// Initializes the PhysSoundObject. Use this if you adding a PhysSoundObject component to an object at runtime. /// </summary> public override void Initialize() { _r = GetComponent <Rigidbody>(); _r2D = GetComponent <Rigidbody2D>(); if (AutoCreateSources) { baseImpactVol = ImpactAudio.volume; baseImpactPitch = ImpactAudio.pitch; _audioContainersDic = new Dictionary <int, PhysSoundAudioContainer>(); AudioContainers = new List <PhysSoundAudioContainer>(); foreach (PhysSoundAudioSet audSet in SoundMaterial.AudioSets) { if (audSet.Slide == null) { continue; } PhysSoundAudioContainer audCont = new PhysSoundAudioContainer(audSet.Key); audCont.SlideAudio = PhysSoundTempAudioPool.GetAudioSourceCopy(ImpactAudio, this.gameObject); audCont.Initialize(this); _audioContainersDic.Add(audCont.KeyIndex, audCont); AudioContainers.Add(audCont); } ImpactAudio.loop = false; } else { if (ImpactAudio) { ImpactAudio.loop = false; baseImpactVol = ImpactAudio.volume; baseImpactPitch = ImpactAudio.pitch; } if (AudioContainers.Count > 0) { _audioContainersDic = new Dictionary <int, PhysSoundAudioContainer>(); foreach (PhysSoundAudioContainer audCont in AudioContainers) { if (!SoundMaterial.HasAudioSet(audCont.KeyIndex)) { Debug.LogError("PhysSound Object " + gameObject.name + " has an audio container for an invalid Material Type! Select this object in the hierarchy to update its audio container list."); continue; } if (PlayClipAtPoint) { audCont.Initialize(this, ImpactAudio); } else { audCont.Initialize(this); } _audioContainersDic.Add(audCont.KeyIndex, audCont); } } } if (PlayClipAtPoint) { PhysSoundTempAudioPool.Create(); } else if (ImpactAudio != null && !ImpactAudio.isActiveAndEnabled) { ImpactAudio = PhysSoundTempAudioPool.GetAudioSourceCopy(ImpactAudio, gameObject); } }