스파르타 Unity 1기
내일배움캠프 25일차 TIL - 사운드 매니저
정주찬
2023. 9. 11. 20:14
오늘의 학습 키워드
사운드 매니저
공부한 내용
사운드 매니저
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인 에셋들도 존재해 사용할 수 있어서 다행이었다.
내일은 아마 미리 먼저 아이템 쪽 구현을 하는 방향으로 생각 중이다. 아니면 다른 팀원분들한테 양해를 구하고 기본적인 로직을 짜는 것을 돕는 것도 고려중이다. 소통이 중요하니 어느 방향이든 팀에 도움이 되는 쪽으로 진행했으면 좋겠다. 내일도 파이팅!