Files
aibis-dream/Assets/Scripts/Framework/AudioKit/AudioManager.cs
T
2024-09-19 01:12:10 +08:00

246 lines
7.5 KiB
C#

using System.Collections;
using AibisDream.Kit;
using UnityEngine;
using Yarn.Unity;
namespace AibisDream
{
public class AudioManager : Singleton<AudioManager>
{
private const string LoopSource = "Loop";
private const string InteractionSource = "Interaction";
private const string VoiceSource = "Voice";
private const string MemorySource = "Memery";
private const string Amb1Source = "Amb1";
private const string Amb2Source = "Amb2";
private AudioSource _loopSource;
private AudioSource _interactionSource;
private AudioSource _voiceSource;
private AudioSource _memorySource;
private AudioSource _amb1Source;
private AudioSource _amb2Source;
public float fadeTime;
public override void OnSingletonInit()
{
_loopSource = transform.Find(LoopSource).GetComponent<AudioSource>();
_interactionSource = transform.Find(InteractionSource).GetComponent<AudioSource>();
_voiceSource = transform.Find(VoiceSource).GetComponent<AudioSource>();
_memorySource = transform.Find(MemorySource).GetComponent<AudioSource>();
_amb1Source = transform.Find(Amb1Source).GetComponent<AudioSource>();
_amb2Source = transform.Find(Amb2Source).GetComponent<AudioSource>();
}
#region 随机播放
public void RandomPlayVoice(string voicePath)
{
AudioClip clip = RandomLoadAudioClip(3, $"Audio/{voicePath}");
_voiceSource.clip = clip;
_voiceSource.Play();
}
[YarnCommand("random_play_interaction")]
public static void RandomPlayInteraction(string interactionName)
{
AudioClip clip = Instance.RandomLoadAudioClip(3, $"Audio/{interactionName}");
if (clip == null)
{
clip = Resources.Load<AudioClip>($"Audio/{interactionName}");
}
Instance._voiceSource.clip = clip;
Instance._voiceSource.Play();
}
public void StopVoice()
{
if (_voiceSource.isPlaying)
{
_voiceSource.Stop();
}
}
[YarnCommand("stop_interaction")]
public static void StopInteraction()
{
Instance._interactionSource.Stop();
}
#endregion
#region 播放唱歌
public void PlayVoice(string actorName, string voiceName)
{
AudioClip clip = RandomLoadAudioClip(3, $"Audio/{actorName}");
_voiceSource.clip = clip;
_voiceSource.Play();
}
#endregion
#region 循环播放
[YarnCommand("play_loop_audio")]
public static void PlayLoopAudio(string audioName)
{
AudioClip clip = Resources.Load<AudioClip>($"Audio/{audioName}");
if (clip == null)
{
clip = Instance.RandomLoadAudioClip(3, $"Audio/{audioName}");
}
Instance._loopSource.clip = clip;
Instance._loopSource.Play();
}
[YarnCommand("pause_loop_audio")]
public static void PauseLoopAudio()
{
Instance._loopSource.Pause();
}
public void ContinueLoopAudio()
{
_loopSource.UnPause();
}
public bool IsLoopPlaying()
{
return _loopSource.isPlaying;
}
#endregion
#region 背景音循环播放
[YarnCommand("play_amb1_audio")]
public static void PlayAmb1Audio(string audioName)
{
Instance._amb1Source.Stop();
AudioClip clip = Resources.Load<AudioClip>($"Audio/{audioName}");
Instance._amb1Source.clip = clip;
Instance._amb1Source.volume = 0f;
Instance._amb1Source.Play();
Instance.StartCoroutine(Instance.FadeTo(1.0f, Instance.fadeTime, Instance._amb1Source));
}
[YarnCommand("pause_amb1_audio")]
public static void PauseAmb1Audio()
{
Instance._amb1Source.Pause();
}
[YarnCommand("fade_out_amb1_audio")]
public static void FadeOutAmb1Audio()
{
Instance.StartCoroutine(Instance.FadeTo(0.0f, Instance.fadeTime, Instance._amb1Source));
}
public void ContinueAmb1Audio()
{
_amb1Source.volume = 0.0f;
_amb1Source.UnPause();
StartCoroutine(FadeTo(1.0f, fadeTime, _amb1Source));
}
[YarnCommand("play_amb2_audio")]
public static void PlayAmb2Audio(string audioName)
{
Instance._amb2Source.Stop();
AudioClip clip = Resources.Load<AudioClip>($"Audio/{audioName}");
Instance._amb2Source.clip = clip;
Instance._amb2Source.volume = 0f;
Instance._amb2Source.Play();
Instance.StartCoroutine(Instance.FadeTo(1.0f, Instance.fadeTime, Instance._amb2Source));
}
[YarnCommand("pause_amb2_audio")]
public static void PauseAmb2Audio()
{
Instance._amb2Source.Pause();
}
[YarnCommand("fade_out_amb2_audio")]
public static void FadeOutAmb2Audio()
{
Instance.StartCoroutine(Instance.FadeTo(0.0f, Instance.fadeTime, Instance._amb2Source));
}
public void ContinueAmb2Audio()
{
_amb2Source.volume = 0.0f;
_amb2Source.UnPause();
StartCoroutine(FadeTo(1.0f, fadeTime, _amb2Source));
}
#endregion
#region 播放记忆
public void PlayMemoryAudio(string memoryName)
{
StartCoroutine(AsyncPlayMemoryAudio(memoryName));
}
public void PauseMemoryAudio()
{
_memorySource.Pause();
}
public void ContinueMemoryAudio()
{
_memorySource.volume = 0.0f;
_memorySource.Play();
StartCoroutine(FadeTo(1.0f, fadeTime, _memorySource));
}
#endregion
public void FadeInLoopAudio(string audioName)
{
AudioClip clip = Resources.Load<AudioClip>(audioName);
_loopSource.clip = clip;
_loopSource.volume = 0.0f;
_loopSource.Play();
StartCoroutine(FadeTo(1.0f, 5f, _loopSource));
}
private IEnumerator FadeTo(float targetVolume, float duration, AudioSource audioSource)
{
float startVolume = audioSource.volume;
float timeElapsed = 0f;
while (timeElapsed < duration)
{
timeElapsed += Time.deltaTime;
audioSource.volume = Mathf.Lerp(startVolume, targetVolume, timeElapsed / duration);
yield return null;
}
audioSource.volume = targetVolume;
}
private AudioClip RandomLoadAudioClip(int audioSize, string path)
{
int randomIndex = Random.Range(0, audioSize) + 1;
return Resources.Load<AudioClip>($"{path}_{randomIndex}");
}
private IEnumerator AsyncPlayMemoryAudio(string memoryName)
{
AudioClip intro = Resources.Load<AudioClip>($"Audio/mem_play");
AudioClip loop = Resources.Load<AudioClip>($"Audio/{memoryName}");
_memorySource.clip = intro;
_memorySource.loop = false;
_memorySource.Play();
yield return new WaitForSeconds(intro.length);
_memorySource.clip = loop;
_memorySource.loop = true;
_memorySource.Play();
}
}
}