인스펙터 창에서 적용하기
스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace DefaultSystem
{
public enum SoundType
{
BGM,
EFFECT,
BGMEFFECT
}
[System.Serializable]
public struct AudioClips
{
public string ID; //이름
public AudioClip clip; // 오디오 클립
}
public class SoundManager : MonoBehaviour
{
public static SoundManager instance;
[SerializeField]
AudioSource[] audioSources = new AudioSource[System.Enum.GetValues(typeof(SoundType)).Length]; // 사운드의 종류만큼 AudioSources를 가짐
[SerializeField]
private List<AudioClips> BgmClip; // BGM
[SerializeField]
private List<AudioClips> BgmEffectClip; // 효과 BGM
[SerializeField]
private List<AudioClips> EffectClip; // 효과음
public void Awake()
{
// Dont Destroy 설정
var obj = FindObjectsOfType<SoundManager>();
if (obj.Length == 1)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
// BGM loop 설정
audioSources[(int)SoundType.BGM].loop = true;
audioSources[(int)SoundType.BGMEFFECT].loop = true;
}
public void Clear()
// audioClips Dictionary를 비워주는 함수
{
// 재생기 전부 재생 스탑, 음반 빼기
foreach (AudioSource audioSource in audioSources)
{
audioSource.clip = null;
audioSource.Stop();
}
}
public AudioClip GetAudioClip(string name, SoundType type = SoundType.EFFECT)
// 오디오클립 선택하기
{
List<AudioClips> currentClipList = null;
// SoundType 확인해서 오디오클립 리스트 선택
if (type == SoundType.BGM)
{
currentClipList = BgmClip;
}
else if (type == SoundType.BGMEFFECT)
{
currentClipList = BgmEffectClip;
}
else if (type == SoundType.EFFECT)
{
currentClipList = EffectClip;
}
else
{
Debug.LogWarning("오디오클립 선택 오류!!!");
}
AudioClip currentClip = currentClipList.Find(x => x.ID.Equals(name)).clip; // 캐릭터 이름이 같은게 있는지 찾아서 해당 캐릭터의 구조체 리스트 넣음
return currentClip;
}
public void Play(string name, SoundType type = SoundType.EFFECT, float volume = 0.5f)
{
AudioClip audioClip = GetAudioClip(name, type);
// BGM
if (type == SoundType.BGM)
{
AudioSource audioSource = audioSources[(int)SoundType.BGM];
if (audioSource.isPlaying) audioSource.Stop();
audioSource.volume = volume;
audioSource.clip = audioClip;
audioSource.Play();
}
// BGM2
else if (type == SoundType.BGMEFFECT)
{
AudioSource audioSource = audioSources[(int)SoundType.BGMEFFECT];
if (audioSource.isPlaying) audioSource.Stop();
audioSource.volume = volume;
audioSource.clip = audioClip;
audioSource.Play();
}
// Effect
else if (type == SoundType.EFFECT)
{
AudioSource audioSource = audioSources[(int)SoundType.EFFECT];
audioSource.volume = volume;
audioSource.PlayOneShot(audioClip);
}
}
}
}