Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }