Files
fnl/Assets/MusicFadeController.cs
2026-02-21 16:40:15 -08:00

116 lines
3.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MusicFadeController : MonoBehaviour {
[SerializeField] public AudioSource audioSource;
public bool shouldLoop = false;
public float originalVolume = 1;
// Keeps track of the most recent fade command.
// Previous fades should stop as soon as the actionCounter increments.
public int actionCounter = 0;
// Credit: https://forum.unity.com/threads/fade-out-audio-source.335031/
public IEnumerator IFadeIn(float time) {
int cache = ++actionCounter;
audioSource.volume = 0;
while (audioSource.volume < originalVolume && actionCounter == cache) {
audioSource.volume += originalVolume * Time.deltaTime / time;
yield return null;
}
// Skip if preempted
if (cache != actionCounter)
yield break;
audioSource.volume = originalVolume;
}
// Credit: https://forum.unity.com/threads/fade-out-audio-source.335031/
IEnumerator IFadeOut(float time) {
int cache = ++actionCounter;
audioSource.volume = originalVolume;
while (audioSource.volume > 0 && actionCounter == cache) {
audioSource.volume -= originalVolume * Time.deltaTime / time;
yield return null;
}
// Skip if preempted
if (cache != actionCounter)
yield break;
audioSource.Stop();
shouldLoop = false;
audioSource.volume = originalVolume;
}
IEnumerator IFadeOutThenIn(float outTime, float inTime, AudioClip loopClip) {
int cache = ++actionCounter;
if (audioSource.isPlaying) {
audioSource.volume = originalVolume;
while (audioSource.volume > 0 && actionCounter == cache) {
audioSource.volume -= originalVolume * Time.deltaTime / outTime;
yield return null;
}
// Skip if preempted
if (cache != actionCounter)
yield break;
audioSource.Stop();
}
audioSource.volume = 0;
audioSource.clip = loopClip;
audioSource.Play();
while (audioSource.volume < originalVolume && actionCounter == cache) {
audioSource.volume += originalVolume * Time.deltaTime / inTime;
yield return null;
}
// Skip if preempted
if (cache != actionCounter)
yield break;
audioSource.volume = originalVolume;
}
public void ChangeVolume(float volume) {
audioSource.volume = originalVolume = volume;
}
public void FadeIn(float time) {
StartCoroutine(IFadeIn(time));
}
public void FadeOut(float time) {
StartCoroutine(IFadeOut(time));
}
public void FadeOutThenIn(float o, float i, AudioClip loopClip) {
StartCoroutine(IFadeOutThenIn(o, i, loopClip));
}
IEnumerator PlayLoopAfter(float time, AudioClip loopClip) {
yield return new WaitForSeconds(time);
if (shouldLoop) {
audioSource.clip = loopClip;
audioSource.Play();
}
}
public void PlayMainMenuLoopAfter(float time, AudioClip loopClip) {
StartCoroutine(PlayLoopAfter(time, loopClip));
}
// Start is called before the first frame update
void Start()
{
originalVolume = audioSource.volume;
}
// Update is called once per frame
void Update()
{
}
}