102 lines
2.6 KiB
C#
102 lines
2.6 KiB
C#
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<AudioSource>();
|
|
|
|
UnkClip = Resources.Load<AudioClip>("Unk");
|
|
BunkClip = Resources.Load<AudioClip>("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);
|
|
}
|
|
}
|