using UnityEngine; using UnityEngine.SceneManagement; using Saltosion.OneWeapon.Utils; namespace Saltosion.OneWeapon.Audio { public enum MusicTrack { None = -1, Elevator = 0, SetFireToReality, // 1, and so on SpaceDimensions, ThrustSequence, } public enum AmbienceTrack { None = -1, Dark = 0, } enum Channel { Music, Ambience, Count } public class MusicPlayer : MonoBehaviour { private static MusicPlayer Singleton; private static int SingletonSceneIndex; [Header("Audio files")] public AudioClip[] MusicClips; public AudioClip[] AmbienceClips; [Header("Other")] public MusicChannelPlayer ChannelPlayerForMusic; public MusicChannelPlayer ChannelPlayerForAmbience; public MusicTrack DebugMusicTrack = MusicTrack.None; public bool DebugSetMusicTrack = false; public AmbienceTrack DebugAmbienceTrack = AmbienceTrack.None; public bool DebugSetAmbienceTrack = false; private MusicChannelPlayer[] Channels; private void Start() { int Index = SceneManager.GetActiveScene().buildIndex; if (SingletonSceneIndex == Index) { Debug.LogWarning($"The scene '{SceneManager.GetActiveScene().name}' has multiple MusicPlayers!\nOnly the last to run Start() will be used."); } SingletonSceneIndex = Index; Singleton = this; Channels = new MusicChannelPlayer[(int)Channel.Count]; Channels[(int)Channel.Music] = ChannelPlayerForMusic; Channels[(int)Channel.Ambience] = ChannelPlayerForAmbience; } private void Update() { ChannelPlayerForMusic.Volume = Options.MusicVolume; ChannelPlayerForAmbience.Volume = Options.AmbienceVolume; if (DebugSetMusicTrack) { DebugSetMusicTrack = false; SetMusicTrack(DebugMusicTrack, true); } if (DebugSetAmbienceTrack) { DebugSetAmbienceTrack = false; SetAmbienceTrack(DebugAmbienceTrack, true); } } private void SetChannelTrack(Channel channel, AudioClip clip, bool fade) { int channelIndex = (int)channel; if (Channels[channelIndex].CurrentlyPlaying) { Channels[channelIndex].FadingOut = fade; } if (clip != null) { Channels[channelIndex].FadingIn = fade; Channels[channelIndex].NextClip = clip; } } public static void SetMusicTrack(MusicTrack track, bool fade) { Singleton.SetChannelTrack(Channel.Music, track == MusicTrack.None ? null : Singleton.MusicClips[(int)track], fade); } public static void SetAmbienceTrack(AmbienceTrack track, bool fade) { Singleton.SetChannelTrack(Channel.Ambience, track == AmbienceTrack.None ? null : Singleton.AmbienceClips[(int)track], fade); } } }