using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManager : MonoBehaviour {
//싱글톤
private static SoundManager instance;
public static SoundManager GetInstance()
{
if (!instance)
{
instance = GameObject.FindObjectOfType(typeof(SoundManager)) as SoundManager;
if (!instance)
Debug.Log("오류");
}
return instance;
}
public int audioSourceCount = 3;//최대 오디오 소스 개수
[SerializeField]
[Header("clips"), Tooltip("오디오 클립들")]
public AudioClip[] BGMs = new AudioClip[2];
public AudioClip[] SFXs = new AudioClip[3];
private AudioSource BGMsource;
private AudioSource[] SFXsource;
private void OnEnable ()
{
BGMsource = gameObject.AddComponent<AudioSource>();
BGMsource.playOnAwake = false;
BGMsource.loop = true;
//sfx 소스 초기화
SFXsource = new AudioSource[audioSourceCount];
for(int i=0;i< SFXsource.Length; i++)
{
SFXsource[i] = gameObject.AddComponent<AudioSource>();
SFXsource[i].playOnAwake = false;
}
}
/**********SFX***********/
public void PlaySFX(string name)//효과음 재생
{
for(int i=0;i<SFXs.Length;i++)
{
if(SFXs[i].name == name)
{
GetEmptySource().clip = SFXs[i];
GetEmptySource().Play();
return;
}
}
}
private AudioSource GetEmptySource()//비어있는 오디오 소스 반환
{
int lageindex = 0;
float lageProgress = 0;
for (int i = 0; i < SFXsource.Length; i++)
{
if (!SFXsource[i].isPlaying)
{
return SFXsource[i];
}
//만약 비어있는 오디오 소스를 못찿으면 가장 진행도가 높은 오디오 소스 반환
float progress = SFXsource[i].time / SFXsource[i].clip.length;
if(progress > lageProgress)
{
lageindex = i;
lageProgress = progress;
}
}
return SFXsource[lageindex];
}
/**********BGM***********/
private AudioClip changeClip;//바뀌는 클립
private bool isChanging =false;
private float startTime;
[SerializeField]
[Header("Changing speed"), Tooltip("브금 바꾸는 속도")]
public float ChangingSpeed;
public void ChangeBGM(string name, bool isSmooth)//브금 변경 (브금이름 , 부드럽게 바꾸기)
{
changeClip = null;
for (int i = 0; i < BGMs.Length; i++)//브금 클립 탐색
{
if (BGMs[i].name == name)
{
changeClip = BGMs[i];
}
}
if (changeClip == null)//없으면 탈주
return;
if (isSmooth)//스무스 하게 체인지 ~
{
startTime = Time.time;
isChanging = true;
}
else
{
BGMsource.clip = changeClip;
BGMsource.Play();
}
}
private void Update()
{
if (!isChanging) return;
float progress = (Time.time - startTime) * ChangingSpeed;//부드러운 오디오 전환
BGMsource.volume = Mathf.Lerp(1, 0, progress);
if(progress > 1)
{
isChanging = false;
BGMsource.clip = changeClip;
BGMsource.Play();
Debug.Log("BGM CHANGE DONE!");
}
}
}