내가 사용하는 사운드/오디오 매니저.
Dictionary로 클립 파일명을 검색해서 실행함.
빈 오브젝트에 AudioSource 하나 넣고,
하위 오브젝트 하나 만들어서 BGM용 AudioSource 하나 넣으면 된다.
랜덤 사운드 호출은 아래와 같이 파일명에 index를 붙여놓고
sound_0
sound_1
sound_2
PlaySound("sound_" + Random.Range(0, 3));
와 같이 호출하면 된다.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(AudioSource))]
public class SoundManager : Singleton<SoundManager>
{
#region 싱글톤
void Awake()
{
if (_instance != null && _instance != this)
{
DestroyImmediate(gameObject);
}
else
{
_instance = this;
//DontDestroyOnLoad(this.gameObject);
AwakeAfter();
}
}
#endregion
public float masterVolumeSFX = 1f;
public float masterVolumeBGM = 1f;
[SerializeField] AudioClip BGMClip; // 오디오 소스들 지정.
[SerializeField] AudioClip[] audioClip; // 오디오 소스들 지정.
Dictionary<string, AudioClip> audioClipsDic;
AudioSource sfxPlayer;
AudioSource bgmPlayer;
void AwakeAfter()
{
sfxPlayer = GetComponent<AudioSource>();
SetupBGM();
audioClipsDic = new Dictionary<string, AudioClip>();
foreach (AudioClip a in audioClip)
{
audioClipsDic.Add(a.name, a);
}
}
void SetupBGM()
{
if (BGMClip == null) return;
GameObject child = new GameObject("BGM");
child.transform.SetParent(transform);
bgmPlayer = child.AddComponent<AudioSource>();
bgmPlayer.clip = BGMClip;
bgmPlayer.volume = masterVolumeBGM;
}
private void Start()
{
if(bgmPlayer != null)
bgmPlayer.Play();
}
// 한 번 재생 : 볼륨 매개변수로 지정
public void PlaySound(string a_name, float a_volume = 1f)
{
if (audioClipsDic.ContainsKey(a_name) == false)
{
Debug.Log(a_name + " is not Contained audioClipsDic");
return;
}
sfxPlayer.PlayOneShot(audioClipsDic[a_name], a_volume * masterVolumeSFX);
}
// 랜덤으로 한 번 재생 : 볼륨 매개변수로 지정
public void PlayRandomSound(string[] a_nameArray, float a_volume = 1f)
{
string l_playClipName;
l_playClipName = a_nameArray[Random.Range(0, a_nameArray.Length)];
if (audioClipsDic.ContainsKey(l_playClipName) == false)
{
Debug.Log(l_playClipName + " is not Contained audioClipsDic");
return;
}
sfxPlayer.PlayOneShot(audioClipsDic[l_playClipName], a_volume * masterVolumeSFX);
}
// 삭제할때는 리턴값은 GameObject를 참조해서 삭제한다. 나중에 옵션에서 사운드 크기 조정하면 이건 같이 참조해서 바뀌어야함..
public GameObject PlayLoopSound(string a_name)
{
if (audioClipsDic.ContainsKey(a_name) == false)
{
Debug.Log(a_name + " is not Contained audioClipsDic");
return null;
}
GameObject l_obj = new GameObject("LoopSound");
AudioSource source = l_obj.AddComponent<AudioSource>();
source.clip = audioClipsDic[a_name];
source.volume = masterVolumeSFX;
source.loop = true;
source.Play();
return l_obj;
}
// 주로 전투 종료시 음악을 끈다.
public void StopBGM()
{
bgmPlayer.Stop();
}
#region 옵션에서 볼륨조절
public void SetVolumeSFX(float a_volume)
{
masterVolumeSFX = a_volume;
}
public void SetVolumeBGM(float a_volume)
{
masterVolumeBGM = a_volume;
bgmPlayer.volume = masterVolumeBGM;
}
#endregion
}
'🌍 Unity > 유니티 프로그래밍' 카테고리의 다른 글
유니티 안드로이드 스크린샷 / 스크린캡쳐 (Unity Android screenCapture) (1) | 2019.11.14 |
---|---|
유니티 앱 설정 열기 (Unity open App setting) (0) | 2019.11.14 |
Unity Fade in Fade out 유니티 페이드 인 페이드 아웃 스크립트 (0) | 2019.06.30 |
유니티 LINQ 활용하기 (0) | 2019.06.06 |
유니티에서 물리 오류가 나는 경우의 대부분은 FixedUpdate. (0) | 2019.05.29 |