오늘의 학습 키워드

사운드 매니저

 

공부한 내용

사운드 매니저

BGM과 SFX를 나누어 사운드 매니저를 구현하였습니다.

음악 이름을 키 값으로 받고 value를 clip으로 받는 딕셔너리를 생성해 관리하도록 했습니다.

세팅 쪽 UI와 연결하여 음량이 변경되면 볼륨이 적용되도록 했습니다.

using System.Collections.Generic;
using UnityEngine;



public enum BGM
{
    MainMenu,
    InGame,
}

public enum SFX
{
    Break,
    Dead,
    LifeDown,
    OnHitBlock1,
    OnHitBlock2,
    OnHitBar,
}

public class SoundManager : MonoBehaviour
{
    public enum Sounds
    {
        BGM,
        SFX,
        MaxCount,
    }

    private static SoundManager _instance;
    public static SoundManager Instance { get => _instance; }

    private AudioSource[] _audioSources = new AudioSource[(int)Sounds.MaxCount];

    private const string BGM_PATH = "Sounds/BGM";
    private const string SFX_PATH = "Sounds/SFX";
    public Dictionary<string, AudioClip> ClipDict { get; } = new Dictionary<string, AudioClip>();

    void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
        }
        
        DontDestroyOnLoad(gameObject);
    }

    private void Start()
    {
        Init();
        PlayBGM(BGM.InGame);
    }

    private void Init()
    {
        for (int i = 0; i < (int)Sounds.MaxCount; i++)
        {
            _audioSources[i] = gameObject.AddComponent<AudioSource>();
        }
        AudioClip[] bgms = Resources.LoadAll<AudioClip>(BGM_PATH);

        foreach (AudioClip clip in bgms)
        {
            ClipDict.Add(clip.name, clip);
        }

        AudioClip[] sfxs = Resources.LoadAll<AudioClip>(SFX_PATH);

        foreach (AudioClip clip in sfxs)
        {
            ClipDict.Add(clip.name, clip);
        }
    }

    public void PlayBGM(BGM bgm)
    {
        AudioSource audioSource = _audioSources[(int)Sounds.BGM];
        if (audioSource.isPlaying)
        {
            audioSource.Stop();
        }

        audioSource.clip = ClipDict[bgm.ToString()];

        audioSource.Play();
    }

    public void PlaySFX(SFX sfx)
    {
        AudioSource audioSource = _audioSources[(int)Sounds.SFX];
        if (audioSource.isPlaying)
        {
            audioSource.Stop();
        }

        audioSource.PlayOneShot(ClipDict[sfx.ToString()]);
    }

    public void SetBGMVolume(float value)
    {
        _audioSources[(int)Sounds.BGM].volume = value;
    }

    public void SetSFXVolume(float value)
    {
        _audioSources[(int)Sounds.SFX].volume = value;
    }
}

 

 

오늘의 회고

 오늘은 사운드 매니저와 리소스 연결 작업을 진행했다. 사운드 매니저는 다른 팀원 분이 하다가 내가 맡게 되었는데 내가 필요로 했던 부분을 미리 생각해놓고 있어서 그리 어려운 작업은 아니었던 것 같다. 우리가 만든 게임은 벽돌깨기 게임이고 아주 고전적인 게임이라서 리소스 찾는 작업에서 오래 걸리진 않았다. CC0인 에셋들도 존재해 사용할 수 있어서 다행이었다.

 내일은 아마 미리 먼저 아이템 쪽 구현을 하는 방향으로 생각 중이다. 아니면 다른 팀원분들한테 양해를 구하고 기본적인 로직을 짜는 것을 돕는 것도 고려중이다. 소통이 중요하니 어느 방향이든 팀에 도움이 되는 쪽으로 진행했으면 좋겠다. 내일도 파이팅!

+ Recent posts