Contents
접기
728x90
개발 배경
로그라이크 게임을 만들면서 사운드 시스템이 필요했다.
- 효과음이 겹치면 끊김
- 씬이 전환되면 BGM이 끊김
- 사운드 코드가 여기저기 퍼짐
사운드 시스템이 없을경우 이러한 문제들이 발생할 수 있기때문에 SoundManager를 만들기로 했다.
SoundManager 기본 구조
[Scene Root]
├── SoundManager ← 빈 GameObject (SoundManager 스크립트 부착)
│ ├── BGMSource ← 배경음 전용 AudioSource
│ ├── SFXSource ← 효과음 전용 AudioSource
오브젝트 | 설명 |
SoundManager | 사운드 매니저 스크립트가 붙은 GameObject |
BGMSource | 배경음용 AudioSource (loop, volume 조절 등) |
SFXSource | 효과음용 AudioSource (PlayOneShot 등 사용) |
BGM과 SFX를 각각 관리하고, 싱글톤 패턴으로 어디서든 접근 가능하게 만들었다.
구현 포인트
- DontDestroyOnLoad(gameObject); 추가해서 씬 전환에도 사운드 유지
- BGM은 루프 재생
- SFX는 PlayOneShot 사용해서 효과음 겹침 문제 해결
- 싱글톤 패턴(Singleton<SoundManager>)으로 관리
사용 방법
상황 | 코드 |
BGM 재생 | SoundManager.Instance.PlayBGMSource(battleBGMClip); |
효과음 재생 | SoundManager.Instance.PlaySFX(clip); |
반복되는 사운드 | SoundManager.Instance.PlaySFX(SFXType.Jump); |
SFXType(Enum)으로 반복 사운드 관리
사운드가 많아지다 보니, 스크립트마다 Clip을 관리하면 번거로웠다.
그래서 효과음을 enum으로 관리하는 방법을 선택했다.
public enum SFXType
{
Jump,
Hit,
Die,
LevelUp,
Click
}
SoundManager.Instance.PlaySFX(SFXType.Jump);
장점
- 효과음 관리가 한 곳에 집중
- 중복 선언 없이 코드 깔끔
- 새로운 사운드 추가 시 enum과 switch문만 수정
같은 소리 100개 동시에 재생
총알이 발사될때마다 효과음을 내고 싶어서 동시에 효과음 소리를 재생할 수 있는 방법을 찾아보았다.
PlayOneShot을 사용하면 가능했다.
AudioSource.PlayOneShot(audioClip);
재생 방법 | 특징 |
audioSource.Play() | ❌ 새로 재생하면 이전 소리가 끊김 |
audioSource.PlayOneShot() | ✅ 같은 소리를 여러 번 겹쳐서 재생 가능 |
Unity는 PlayOneShot() 호출 시마다 내부적으로 인스턴스를 따로 생성해준다.
덕분에 100개든 200개든 겹쳐서 효과음을 재생할 수 있다.
현실적인 한계
Unity 기본 세팅에서는 동시 재생 오디오 수에 제한이 있다:
- 보통 32~256개
- 초과되면 일부 사운드 재생 누락 가능
대응법
방법 | 설명 |
AudioSource 풀링 | AudioSource를 여러 개 준비해서 분산 재생 |
AudioMixer 설정 조정 | Voice Limit 수치를 올려서 동시 재생 수 증가 |
재생 제한 로직 추가 | 같은 소리를 0.1초 딜레이로 제한하는 방법 |
실제 출시 게임은 AudioMixer + 풀링 조합을 많이 쓴다고 한다.
📖 요약
항목 | 결과 |
구조 | 싱글톤 SoundManager + BGM/SFX 분리 |
효과음 중복 재생 | PlayOneShot() 사용으로 문제 해결 |
반복 사운드 관리 | SFXType enum으로 깔끔하게 |
사운드 타이밍 | Animation Event로 자연스러운 효과 |
직접 해보니 느낀 점
장점 | 단점 |
사운드 관리가 일관되고 깔끔해짐 | 사운드가 많아지면 SFXType 관리 부담 |
효과음 중첩 문제 해결 | 100개 이상 재생은 별도 튜닝 필요 |
이번에 SoundManager를 직접 만들면서 느낀 건:
처음에 시간 좀 써서 시스템화 해두면 나중에 정말 편하다는 것!
728x90