TIL

2024 12 24 TIL

noc777 2024. 12. 24. 21:27

배경음악과 효과음을 사용하기 위해 사운드 매니저를 제작해보고 있다.

현재 사운드 매니저의 제작 목적은 특정 상황에서 사용될 배경음악과 효과음을 설정해주고 

볼륨 조절과 같은 기능을 관리하는 역할을 해주고 싶다. 

 

public enum eBGMType
{
    LobbyBGM,
    InGame_NormalBGM,
    InGame_ChaseBGM,
    TestBGM
}

//효과음//
public enum eSFXType
{
    MatchedPuzzleSFX,
    UnmatchedPuzzleSFX,
}

public class SoundManager : MonoSingleton<SoundManager>
{
    public AudioSource audioSource;
    private Dictionary<string, AudioClip> soundPool = new Dictionary<string, AudioClip>();
    
    [SerializeField][Range(0f, 1f)] private float bgmVolume;

    protected override void Awake()
    {
        base.Awake();
        audioSource = gameObject.GetComponent<AudioSource>();
        SetBGMVolume(0.1f);
        audioSource.loop = true;
    }

    private void Start()
    {
        ChangeBGM(eBGMType.TestBGM);
    }

    //bgm메서드//

    //bgm재생 및 교체
    public void ChangeBGM(eBGMType bgm)
    {
        StopBGM();

        string bgmName = bgm.ToString();

        if (soundPool.ContainsKey(bgmName))
        {
            audioSource.clip = soundPool[bgmName];
            audioSource.Play();
            return;
        }

        GetSoundToResource(bgmName, eCategoryType.BGM);

        audioSource.clip = soundPool[bgmName];
        audioSource.Play();
    }

    //bgm정지
    public void StopBGM()
    {
        audioSource.Stop();
    }

    //bgm 볼륨조절
    public void SetBGMVolume(float volume)
    {
        audioSource.volume = volume;
    }

    //효과음 메서드//

    //지속적인 효과음을 재생하기 위해서 AudioClip을 넘겨주는 방식의 메서드
    public AudioClip PlaySFX(eSFXType sfx)
    {
        string sfxName = sfx.ToString();

        if (soundPool.ContainsKey(sfxName))
        {
            return soundPool[sfxName];
        }

        GetSoundToResource(sfxName, eCategoryType.Effect);

        var clip = soundPool[sfxName];
        return clip;
    }

    //매니저에서 짧은 효과음을 재생하는 메서드
    public void PlayOneShotSFX(eSFXType sfx,float volume = 0.2f)
    {
        string sfxName = sfx.ToString();

        if(soundPool.ContainsKey(sfxName))
        {
            var clip = soundPool[sfxName];
            audioSource.PlayOneShot(clip,volume);
            return;
        }
        else
        {
            GetSoundToResource(sfxName, eCategoryType.Effect);

            var clip = soundPool[sfxName];
            audioSource.PlayOneShot(clip, volume);
            return;
        }
    }

    //리소스에서 사운드를 가져오는 메서드
    private void GetSoundToResource(string name,eCategoryType soundType)
    {
        if (soundPool.ContainsKey(name)) return;

        var clip =  ResourceManager.Instance.LoadAsset<AudioClip>(name, eAssetType.Sound, soundType);

        if(clip == null) return;

        soundPool.Add(name, clip);
    }
}

 

배경음악을 조절하는 것은 어렵지 않을 것 같으나 

효과음들은 각 오브젝트가 오디오소스를 통해 역할을 수행을 할예정이라 

어떤식으로 가져오는 것이 좋을 지 고민중이다.

오디오 클립을 나누어 줄 때 오디오 소스를 같이 가져오는 방식도 고려중이다. 

'TIL' 카테고리의 다른 글

2024 12 27 TIL  (0) 2024.12.27
2024 12 26 TIL  (0) 2024.12.26
2024 12 23 TIL  (0) 2024.12.23
2024 12 20 TIL  (0) 2024.12.20
2024 12 19 TIL  (0) 2024.12.19