MayHeCome/Assets/Scripts/AudioManager.cs

163 lines
4.4 KiB
C#
Raw Normal View History

2024-12-18 09:55:34 +00:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Audio;
public class AudioManager : Singleton<AudioManager>
{
public AudioClip PraySound;
public AudioClip FaithPickSound;
public AudioMixer AudioMixer;
public List<AudioClip> BGMs = new();
public List<AudioClip> ChopWoodSFX = new();
public List<AudioClip> BlobBornSFX = new();
public List<AudioClip> KowSFX = new();
public List<AudioClip> KowtowSFX = new();
private List<float> TargetLayerFrequency = new List<float>();
public AudioSource BuildingsLayerAudioSource;
public AudioSource BattleLayerAudioSource;
public AudioSource PrayLayerAudioSource;
public AudioSource ShenPuAudioSource;
public AudioClip ForwardSceneSound;
public AudioClip BackwardSceneSound;
public float AudioCoolDownTime = 0.02f;
public float CurrentCoolDownTime = 0f;
public void PlayBgm(int index)
{
GetComponent<AudioSource>().PlayOneShot(BGMs[index]);
}
public void PlayFaithGainSFX(float pitch)
{
if (CurrentCoolDownTime >= 0) return;
CurrentCoolDownTime = AudioCoolDownTime;
PrayLayerAudioSource.pitch = pitch;
PrayLayerAudioSource.Stop();
PrayLayerAudioSource.PlayOneShot(FaithPickSound);
}
public void PlayKowSFX(AudioSource ac)
{
ac.PlayOneShot(KowSFX.RandomPick());
}
public AudioClip holySound;
public void PlayHoly(AudioSource ac)
{
ac.PlayOneShot(holySound);
}
public void PlayChopWoodSFX()
{
BuildingsLayerAudioSource.PlayOneShot(ChopWoodSFX.RandomPick());
}
public void PlayEnemyChopWoodSFX()
{
BattleLayerAudioSource.pitch = 0.2f;
BattleLayerAudioSource.PlayOneShot(ChopWoodSFX.RandomPick());
// BuildingsLayerAudioSource.pitch = 1f;
}
public AudioClip hornSound;
public void SpawnEnemySFX(AudioSource ac)
{
ac.PlayOneShot(hornSound);
}
public void PlayBlobBornSFX()
{
BuildingsLayerAudioSource.PlayOneShot(BlobBornSFX.RandomPick());
}
public void PlayKowtowSFX(AudioSource ac)
{
ac.PlayOneShot(KowtowSFX.RandomPick());
}
private void Start()
{
TargetLayerFrequency = (from t in SceneTransitionManager.Instance.TransitionPoints select 5000.0f).ToList();
}
// 调整 LowPass 滤波器的 Cutoff Frequency
public void SetLowPassCutoff(int layerIndex, float cutoffFrequency)
{
AudioMixer.SetFloat($"Layer{layerIndex}LowPass", Mathf.Clamp(cutoffFrequency, 10f, 22000f));
}
public float GetLowPassCutoff(int layerIndex)
{
float result = 0f;
if (!AudioMixer.GetFloat($"Layer{layerIndex}LowPass", out result))
{
//Debug.LogError($"Audio Mixer没有这个: Layer{layerIndex}LowPass");
}
return result;
}
public void OnSceneTransition(int transitIndex)
{
for (int i = 0; i < SceneTransitionManager.Instance.TransitionPoints.Count; i++)
{
TargetLayerFrequency[i] = transitIndex == i ? 5000f : 1000f / Mathf.Abs(transitIndex - i);
}
}
public void PlaySFXOneShot()
{
}
private void Update()
{
CurrentCoolDownTime -= Time.deltaTime;
for (int i = 0; i < SceneTransitionManager.Instance.TransitionPoints.Count; i++)
{
SetLowPassCutoff(i, 0.2f * TargetLayerFrequency[i] + 0.8f * GetLowPassCutoff(i));
}
}
public void PlayAccumulateShot()
{
}
/*private IEnumerator AdjustPitchOverTime()
{
audioSource.pitch = 1.0f; // 初始 pitch
audioSource.loop = false; // 单次播放,协程中控制循环
while (audioSource.pitch < maxPitch)
{
audioSource.Play(); // 播放音频
// 等待音频播放指定的持续时间
yield return new WaitForSeconds(playDuration);
// 增加 pitch但不超过 maxPitch
audioSource.pitch = Mathf.Min(audioSource.pitch + pitchIncrement, maxPitch);
// 等待播放间隔
yield return new WaitForSeconds(delayBetweenPlays);
}
// 到达 maxPitch 后循环播放,不再递增 pitch
audioSource.pitch = maxPitch;
audioSource.loop = true;
audioSource.Play();
}*/
}