void Awake()
        {
            var audioAnchors = transform?.Find("Audio anchors");
            var engineAudio  = audioAnchors.transform?.Find("Engine");

            var Engine_Layered = engineAudio?.Find("Engine_Layered(Clone)");

            var Engine_Layered_Audio = Engine_Layered.GetComponent <LayeredAudio>();

            var EngineFan_Layered = new GameObject();

            EngineFan_Layered.name                    = "EngineFan_Layered";
            EngineFan_Layered.transform.parent        = engineAudio;
            EngineFan_Layered.transform.localPosition = Vector3.zero;
            EngineFan_Layered.transform.localRotation = Quaternion.identity;

            var train_engine_layer_fan = new GameObject();

            train_engine_layer_fan.name                    = "train_engine_layer_fan";
            train_engine_layer_fan.transform.parent        = EngineFan_Layered.transform;
            train_engine_layer_fan.transform.localPosition = Vector3.zero;
            train_engine_layer_fan.transform.localRotation = Quaternion.identity;

            var audioSource = train_engine_layer_fan.AddComponent <AudioSource>();

            audioSource.outputAudioMixerGroup = Engine_Layered_Audio.audioMixerGroup;
            audioSource.playOnAwake           = true;
            audioSource.loop         = true;
            audioSource.maxDistance  = 300f;
            audioSource.clip         = Main.fanAudioClip;
            audioSource.spatialBlend = 1f;
            audioSource.dopplerLevel = 0f;
            audioSource.spread       = 10f;

            var audioLayer = new LayeredAudio.Layer();

            audioLayer.name          = "engine_fan";
            audioLayer.volumeCurve   = AnimationCurve.Linear(0f, 0f, 1f, 1f);
            audioLayer.usePitchCurve = false;
            audioLayer.inertia       = 0f;
            audioLayer.inertialPitch = false;
            audioLayer.source        = audioSource;
            audioLayer.refVelo       = 0f;
            audioLayer.startPitch    = 0.5f;

            var layeredAudio = EngineFan_Layered.AddComponent <LayeredAudio>();

            layeredAudio.audioMixerGroup = Engine_Layered_Audio.audioMixerGroup;
            layeredAudio.layers          = new LayeredAudio.Layer[1];
            layeredAudio.layers[0]       = audioLayer;
            layeredAudio.RandomizeTime();
            layeredAudio.Reset();
            layeredAudio.Play();
            layeredAudio.masterVolume = 0.6f;

            fanAudio   = layeredAudio;
            controller = gameObject.GetComponent <LocoControllerShunter>();
        }
Exemple #2
0
        public static void Apply(TrainCarType carType, SoundType soundType, Config.SoundDefinition?soundDefinition, LayeredAudio audio)
        {
            var key = new DefaultKey(carType, soundType);

            Main.DebugLog(() => $"Loading {key}: {soundDefinition}");
            var mainLayer = audio.layers[0];

            if (!Defaults.ContainsKey(key))
            {
                Defaults[key] = new AudioSettings()
                {
                    clip        = mainLayer.source.clip,
                    pitch       = mainLayer.startPitch,
                    minPitch    = audio.minPitch,
                    maxPitch    = audio.maxPitch,
                    pitchCurve  = mainLayer.pitchCurve,
                    volumeCurve = mainLayer.volumeCurve,
                };
                Main.DebugLog(() => $"Saved default settings for {key}: {Defaults[key]}");
            }

            var defaults = Defaults[key];

            if (soundDefinition == null)
            {
                audio.minPitch        = defaults.minPitch !;
                audio.maxPitch        = defaults.maxPitch !;
                mainLayer.source.clip = defaults.clip;
                mainLayer.startPitch  = defaults.pitch;
                mainLayer.pitchCurve  = defaults.pitchCurve;
                mainLayer.volumeCurve = defaults.volumeCurve;
                for (int i = 1; i < audio.layers.Length; i++)
                {
                    audio.layers[i].source.mute = false;
                }
            }
            else
            {
                audio.minPitch        = soundDefinition.minPitch ?? defaults.minPitch * defaults.pitch;
                audio.maxPitch        = soundDefinition.maxPitch ?? defaults.maxPitch * defaults.pitch;
                mainLayer.source.clip = soundDefinition.filename.Map(FileAudio.Load) ?? defaults.clip;
                mainLayer.startPitch  = 1f;
                mainLayer.pitchCurve  = AnimationCurve.EaseInOut(
                    0f, soundDefinition.minPitch ?? defaults.pitchCurve.Evaluate(0),
                    1f, soundDefinition.maxPitch ?? defaults.pitchCurve.Evaluate(1));
                mainLayer.volumeCurve = AnimationCurve.EaseInOut(
                    0f, soundDefinition.minVolume ?? defaults.volumeCurve.Evaluate(0),
                    1f, soundDefinition.maxVolume ?? defaults.volumeCurve.Evaluate(1));

                for (int i = 1; i < audio.layers.Length; i++)
                {
                    audio.layers[i].source.mute = true;
                }
            }
        }