コード例 #1
0
 private static void SetReverbPreset() // Custom function for setting reverb preset.
 {
     if (curReverbPreset != lastReverbPreset)
     {
         lastReverbPreset = curReverbPreset;
         float[] arr = ReverbPresetArrays[(int)curReverbPreset];
         audioReverb.dryLevel         = arr[0];
         audioReverb.room             = arr[1];
         audioReverb.roomHF           = arr[2];
         audioReverb.roomLF           = arr[3];
         audioReverb.decayTime        = arr[4];
         audioReverb.decayHFRatio     = arr[5];
         audioReverb.reflectionsLevel = arr[6];
         audioReverb.reflectionsDelay = arr[7];
         audioReverb.reverbLevel      = arr[8];
         audioReverb.reverbDelay      = arr[9];
         audioReverb.hfReference      = arr[10];
         audioReverb.lfReference      = arr[11];
         audioReverb.diffusion        = arr[12];
         audioReverb.density          = arr[13];
     }
 }
コード例 #2
0
            private static void Postfix(GorillaLocomotion.Player __instance)
            {
                try
                {
                    if (fetched)
                    {
                        Vector3 plyPos = __instance.bodyCollider.transform.position; // Get player position.

                        if (!ranOnce)
                        {
                            audio                = Resources.FindObjectsOfTypeAll <AudioListener>()[0]; // Get audio listener.
                            audioReverb          = audio.gameObject.AddComponent <AudioReverbFilter>();
                            audioLowPass         = audio.gameObject.AddComponent <AudioLowPassFilter>();
                            audioReverb.enabled  = true;
                            audioLowPass.enabled = false;
                            triggers             = Resources.FindObjectsOfTypeAll <GorillaTriggerBox>();
                            for (int i = 0; i < ambienceAudio.Length; i++) // Create audio sources.
                            {
                                if (i != 7 || i != 8)                      // Is this actually working?
                                {
                                    AudioSource source = GorillaLocomotion.Player.Instance.gameObject.AddComponent <AudioSource>();
                                    sources.Add(source);
                                }
                            }
                            int cnt = 0;
                            foreach (AudioSource source in sources) // Set up audio sources.
                            {
                                source.volume = 0f;
                                source.loop   = true;

                                source.clip = ambienceAudio[cnt];
                                source.Play();
                                cnt++;
                            }

                            foreach (GorillaTriggerBox trig in triggers) // Set up triggers.
                            {
                                if (triggerList.Contains <string>(trig.name))
                                {
                                    boundList.AddItem <Bounds>(trig.GetComponent <Collider>().bounds);
                                }
                            }

                            triggerSides[(int)Areas.None]      = false; // How could I do this better? Actually I know, I'll do it later! Or will I?
                            triggerSides[(int)Areas.Forest]    = false;
                            triggerSides[(int)Areas.Cosmetics] = false;
                            triggerSides[(int)Areas.Cave]      = false;
                            triggerSides[(int)Areas.Canyon]    = false;

                            ranOnce           = true;
                            sources[5].volume = volume;
                            GameObject.Destroy(sources[5], ambienceAudio[5].length); // Destroy startup sound game object.
                            timeSinceLoad = Time.time;

                            //Inserting computer ambience here. Computer ambience is 3D sound for now.
                            pcSource              = GorillaComputer.instance.gameObject.AddComponent <AudioSource>();
                            pcSource.volume       = volume / 8;
                            pcSource.spatialBlend = 1f;
                            pcSource.maxDistance  = 1f;
                            pcSource.clip         = ambienceAudio[6];
                            pcSource.loop         = true;
                            pcSource.Play();

                            Console.WriteLine(Application.streamingAssetsPath);

                            Console.WriteLine("Ambient Sounds is ready!");
                        }
                        if (Time.frameCount % 5 == 0)                           // OpTiMiZaTiOnS!?!?
                        {
                            Task t1 = new Task(() =>                            // Run in new thread. Multi-threading for the win!
                            {
                                foreach (GorillaTriggerBox trigger in triggers) // Cycle through all triggers, maybe a better way?
                                {
                                    string name     = trigger.name;
                                    Bounds bounds   = trigger.GetComponent <Collider>().bounds;
                                    Vector3 closest = bounds.ClosestPoint(plyPos);
                                    Vector3 center  = bounds.center;
                                    bool hit        = bounds.Intersects(__instance.bodyCollider.bounds);
                                    float dist      = (plyPos - closest).magnitude / 6;

                                    AudioSource source = new AudioSource();
                                    float tmpVolume    = -0f;
                                    Areas side         = Areas.None;
                                    bool sideBool      = false;
                                    switch (name) // Ignore everything in this switch statement, it's all a mess! AHHHHH!!
                                    {
                                    case "JoinPublicRoom (tree exit)":
                                        if (hit)
                                        {
                                            side = Areas.Forest;
                                            if (plyPos.z > center.z - 1)
                                            {
                                                sideBool        = true;
                                                curReverbPreset = UserReverbPresets.Forest;
                                                pcSource.volume = 0f;
                                            }
                                            else if (plyPos.x < center.x + 2 && plyPos.x > center.x - 3)
                                            {
                                                sideBool        = false;
                                                curReverbPreset = UserReverbPresets.Room;
                                                pcSource.volume = volume / 8;
                                            }
                                        }
                                        source = sources[(int)Tracks.Forest - 1];

                                        if (!triggerSides[(int)Areas.Forest])
                                        {
                                            if (!triggerSides[(int)Areas.Cosmetics])
                                            {
                                                tmpVolume = (1 - dist) * volume;
                                            }
                                            Vector3 dir      = (__instance.headCollider.transform.position - closest).normalized;
                                            source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2);
                                        }
                                        else
                                        {
                                            source.panStereo = 0f;
                                        }

                                        break;

                                    case "JoinPublicRoom (cave entrance)":
                                        if (hit)
                                        {
                                            side = Areas.Cave;
                                            if (plyPos.z < center.z)
                                            {
                                                curReverbPreset = UserReverbPresets.Cave;
                                                sideBool        = true;
                                            }
                                            else
                                            {
                                                curReverbPreset = UserReverbPresets.Hallway;
                                                sideBool        = false;
                                            }
                                        }
                                        source = sources[(int)Tracks.Cave - 1];
                                        if (triggerSides[(int)Areas.Cave])
                                        {
                                            tmpVolume = Mathf.Clamp(dist, 0, 1) * volume;
                                        }
                                        else
                                        {
                                            tmpVolume = 0;

                                            if (triggerSides[(int)Areas.Cave])
                                            {
                                                if (plyPos.y < 20)
                                                {
                                                    Console.WriteLine("1");
                                                    curReverbPreset = UserReverbPresets.Forest;
                                                }
                                                else
                                                {
                                                    curReverbPreset = UserReverbPresets.Cave;
                                                }
                                            }
                                        }
                                        break;

                                    case "LeavingCaveGeo":
                                        if (hit)
                                        {
                                            if (plyPos.y < center.y)
                                            {
                                                curReverbPreset = UserReverbPresets.Hallway;
                                            }
                                            else
                                            {
                                                curReverbPreset = UserReverbPresets.Room;
                                            }
                                        }

                                        break;

                                    case "EnteringCosmetics":
                                        if (hit)
                                        {
                                            side = Areas.Cosmetics;
                                            if (plyPos.x < center.x)
                                            {
                                                sideBool        = true;
                                                pcSource.volume = 0f;
                                            }
                                            else
                                            {
                                                sideBool        = false;
                                                pcSource.volume = volume / 8;
                                            }
                                        }
                                        source = sources[(int)Tracks.Cosmetics - 1];

                                        if (triggerSides[(int)Areas.Cosmetics])
                                        {
                                            tmpVolume = Mathf.Clamp(dist * 2, 0, 1) * volume;
                                        }
                                        else
                                        {
                                            tmpVolume = 0;
                                        }
                                        break;

                                        /*
                                         * if (!triggerSides[(int)Areas.Cosmetics] && !triggerSides[(int)Areas.Forest])
                                         * {
                                         *  tmpVolume = (1 - dist * 3) * volume;
                                         *  Vector3 dir = (__instance.headCollider.transform.position - closest).normalized;
                                         *  source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2);
                                         * }
                                         * else
                                         * {
                                         *  Vector3 dir = (__instance.headCollider.transform.position - closest).normalized;
                                         *  source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2);
                                         *  if (triggerSides[(int)Areas.Forest])
                                         *      tmpVolume = 0;
                                         * }
                                         */
                                        break;

                                    case "JoinPublicRoom (canyon)":
                                        if (hit)
                                        {
                                            side = Areas.Canyon;
                                            if (plyPos.z < center.z)
                                            {
                                                sideBool        = true;
                                                curReverbPreset = UserReverbPresets.City;
                                            }
                                            else if (plyPos.x < center.x + 2 && plyPos.x > center.x - 3)
                                            {
                                                sideBool        = false;
                                                curReverbPreset = UserReverbPresets.Room;
                                            }
                                        }
                                        source = sources[(int)Tracks.Canyon - 1];
                                        if (!triggerSides[(int)Areas.Canyon] && !triggerSides[(int)Areas.Forest])
                                        {
                                            tmpVolume        = (1 - dist) * volume;
                                            Vector3 dir      = (__instance.headCollider.transform.position - closest).normalized;
                                            source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2);
                                        }
                                        else
                                        {
                                            source.panStereo = 0f;

                                            if (triggerSides[(int)Areas.Forest])
                                            {
                                                tmpVolume = 0;
                                            }

                                            if (triggerSides[(int)Areas.Canyon])
                                            {
                                                if (plyPos.y < 5)
                                                {
                                                    curReverbPreset = UserReverbPresets.Hallway;
                                                }
                                                else
                                                {
                                                    curReverbPreset = UserReverbPresets.City;
                                                }
                                            }
                                        }
                                        break;

                                    case "QuitBox":
                                        source    = sources[(int)Tracks.Void - 1];
                                        tmpVolume = (1 - Mathf.Clamp((float)Math.Log(dist / 2.5f), 0, 1)) * volume * 2;
                                        //tmpVolume = (1 - dist / 25) * volume;
                                        break;
                                    }
                                    if (tmpVolume != -0f) // Weird crap here.
                                    {
                                        source.volume = tmpVolume;
                                    }
                                    if (side != Areas.None) // Why do I have Areas.None??
                                    {
                                        triggerSides[(int)side] = sideBool;
                                    }
                                }
                                // Falling and reverb.
                                AudioSource falling = sources[(int)Tracks.Falling - 1];
                                float vel           = __instance.GetComponent <Rigidbody>().velocity.magnitude;

                                falling.pitch  = Mathf.Clamp((float)Math.Log(vel / 5), 0, 3);
                                falling.volume = (float)Math.Log(vel / 10) * volume * 12;

                                SetReverbPreset();
                            });
                            t1.Start();
                        }
                        float time = Time.time - timeSinceLoad; // Startup sound. OpTiMiZe!
                        if (time < 1)
                        {
                            AudioListener.volume = time;
                        }
                    }
                }
                catch (Exception err)
                {
                    Console.WriteLine("AmbientSounds Error! : " + err);
                }
            }