public static AudioSlapback FindClosest(Vector3 p, out Vector3 rp, out Vector3 rd) { var lp = Heartbeat.listenerTransform.position; float dp = Mathf.Infinity; AudioSlapback z = null; rp = Vector3.zero; rd = Vector3.zero; p.y = 0f; foreach (var i in allSlapbacks) { var t = i.transform; var qq = t.position; var q = qq; q.y = 0f; var d = q - p; float e = d.sqrMagnitude; if (dp <= e) { continue; } var fwd = t.forward; if (Vector3.Dot(d.normalized, fwd) >= 0f) { continue; } var ld = q - lp; if (Vector3.Dot(ld.normalized, fwd) >= 0f) { continue; } dp = e; rp = qq; rd = d; z = i; } return(z); }
internal static bool Activate( AudioMixerGroup g, AudioClip c, Parameters p, ActivationParams ap #if UNITY_EDITOR , Patch patch #endif ) { float r = p.randomization.distance.GetRandomValue(); if (!Mathf.Approximately(r, 0f)) { float a = Randomizer.plusMinusOne * Mathf.PI; r *= (p.spatial.distance.max - p.spatial.distance.min); r += p.spatial.distance.min; ap.position.x += Mathf.Sin(a) * r; ap.position.z += Mathf.Cos(a) * r; } var pos2 = ap.position; if (ap.transform != null) { pos2 += ap.transform.position; } bool looping = ActivateInternal( g, c, p, ap, pos2, 1f #if UNITY_EDITOR , patch #endif ); if (!looping && p.occlusion.function != OcclusionFunction.None && p.slapback.patch != null) { AudioSlapback s; Vector3 pos3, d3; if ((bool)(s = AudioSlapback.FindClosest(pos2, out pos3, out d3))) { var patch2 = p.slapback.patch; var p2 = patch2.program.parameters; var lpos = Heartbeat.listenerTransform.position; var d = pos3 - lpos; var pos4 = pos3 + d.normalized * s.radius; float dt = s.radius / OcclusionSettings.instance.speedOfSound; p2.randomization.distance.min = 0f; p2.randomization.distance.max = 0f; p2.occlusion.function = OcclusionFunction.Slapback; float gain; var clip = patch2.program.GetClip(out gain); if (!clip) { Debug.LogError("Activate: Null AudioClip from patch: " + patch2, patch2); } Activate( patch2.program.mixerGroup, clip, p2, new ActivationParams { transform = null, position = pos4, delay = ap.delay + dt, volume = ap.volume * (1f + gain), modVolume = ap.modVolume, handle = ap.handle } #if UNITY_EDITOR , patch2 #endif ); } } return(looping); }