using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Audio; using EntityNetwork; public class AudioProvider : EntityBase, IAutoRegister { public static AudioProvider Instance; public override void Awake() { base.Awake(); Instance = this; bgmSrc = GetComponent(); UnkClip = Resources.Load("Unk"); BunkClip = Resources.Load("Bunk"); } public float musicSpeed = 1f; AudioSource bgmSrc; public bool fastBGM = false; public static bool MuteBGM { get { var current = AudioHelper.VolumeLevel(AudioHelper.AudioCategory.Music); if (current == 0) return true; return false; } set { AudioHelper.SetVolume(AudioHelper.AudioCategory.Music, value ? 0f : 0.375f); } } public static bool MuteSFX { get { var current = AudioHelper.VolumeLevel(AudioHelper.AudioCategory.Fx); if (current == 0) return true; return false; } set { AudioHelper.SetVolume(AudioHelper.AudioCategory.Fx, value ? 0f : 0.375f); } } [ContextMenu("Speedup Music for 5s")] public void SpeedupForFiveSeconds() { Instance.fastBGM = true; timeUntilSlow = Time.time + 5f; } public static float timeUntilSlow = 0f; public static void RequestFastMusic() { Instance.fastBGM = true; timeUntilSlow = Time.time + 3f; } static AudioClip UnkClip, BunkClip; public static void Unk() { PlaySFX(UnkClip, AudioHelper.AudioCategory.Fx); } public static void Bunk() { PlaySFX(BunkClip, AudioHelper.AudioCategory.Fx); } public void Update() { bgmSrc.loop = true; bgmSrc.volume = AudioHelper.VolumeLevel(AudioHelper.AudioCategory.Music); bgmSrc.pitch = fastBGM ? 1.3333f : 1f; bgmSrc.outputAudioMixerGroup.audioMixer.SetFloat("ShiftPitch", fastBGM ? 0.75f : 1f); if (Time.time > timeUntilSlow) fastBGM = false; } int lastAudioFrame = 0; public static void PlaySFX(AudioClip sfx, AudioHelper.AudioCategory category = AudioHelper.AudioCategory.Fx, float volume = 1.0f, bool sendRemote = true) { if (sfx == null) return; if (sendRemote) Instance.RaiseEvent('s', true, AudioHelper.ByClip(sfx), (byte)category, volume); else Instance.InternallyPlaySFXEvent(AudioHelper.ByClip(sfx), (byte)category, volume); } [NetEvent('s')] public void InternallyPlaySFXEvent(int sfxID, byte category, float volume) { // Don't allow multiple audio sources to trigger at once if (Time.frameCount == lastAudioFrame) return; lastAudioFrame = Time.frameCount; var clip = AudioHelper.ByID(sfxID); AudioSource.PlayClipAtPoint(clip, Camera.main.transform.position, AudioHelper.VolumeLevel((AudioHelper.AudioCategory)category) * volume); } }