본문 바로가기
  • 식초 한잔 할래..?
공부/게임 공부

AudioManager와 EffectManager

by 돼지피그푸곰 2025. 11. 3.
  • UIManager와 AudioManer, EffectManager의 차이

저번 시간에는 UIManager를 enum과 Dictionary방식으로 리소스를 관리하여 만들었습니다.

AudioManager와 EffectManager도 똑같은 방식으로 만들 예정인데, 쓰이는 방식이 다르다 보니 약간씩 달라지는 부분들이 있었습니다.

 

기본적인 작동 원리가 다르기 때문에 완전히 똑같은 코드로 짜는 것은 불가능 합니다.

 

EffectManager는 UI버튼을 클릭하는 것 까지 하지 않는 이상 사실상 Ingame내에서만 작동하기 때문에 GameManager와의 의존성은 거의 없었습니다.

 

반면 UIManager는 게임 전반적인 UI개선과, 각 Scene을 이어줄 때, 게임을 멈출 때 등으로 영향을 주기 때문에 나중에는 생각보다 더 많은 기능을 넣게 되었습니다. 그리고 다른 둘과 다르게 토글 형식이었구요. 

 

AudioManager는 이벤트 기반 호출 대신 Player가 Jump를 했을 때, 유저가 마우스를 클릭 했을 때 소리가 나게 했기 때문에 해당하는 부분의 코드에 한 줄만 추가하는 식으로 만들었습니다. 

 

또 UIManager와 다르게 Audio와 Effect는 외부에서 가져온 소스들이 필요했습니다.

UIManager는 GameObject로 만들었고, Audio와 Effect는 외부에서 사운드 소스, 애니매이션 소스를 가져왔습니다.

사용되는 범위 또한 달랐습니다.

 

때문에 UIManager는 Instance를 씬 마다 재생성 하지만 Audio와 Effect는 전역으로 유지했습니다. 

 

AudioManager와 EffectManager의 Inspector입니다.

enum으로 만든 키들을 이용해 각 Prefab, AudioSource에 연결해 주었습니다.

Audio소스는 미리 하이라키에 준비해서 그때 그때 필요한 사운드를 틀어주는 방식이고, Effect는 그때 그때 생성하는 방식입니다.

다만 실무에서는 많은 이펙트등이 발생했을 때 느려지는 것을 대비하여 Object Pooling방식을 많이 사용한다고 합니다. 

 

핵앤 슬래쉬나 뱀파이어 서바이버 처럼 매우 많은 오브젝트(적들)이 그때 그때 소환되고, 죽으면 Destroy하고, 다시 소환하고. 이 방식은 CPU에 비효율적인 부하를 너무 많이 주기 때문에 활성화, 비활성화 하는 방식으로 계속 그 자리에 일정한 수의 오브젝트들을 놔두는 방식인 것으로 알고 있습니다. 

 

  • SFX와 BGM

깜빡하고 있었는데, Audio의 역할에 따라서도 취급이 달랐습니다.

 

BGM같은 경우에는 TitleScene에 이어 게임 전반적으로 계속 흘러야 하며, BGM 소스의 시간이 다 끝 나면 그 다음 소스와 자연스럽게 바뀐다던지, 아니면 무제한으로 Loop한다던지 정하고. 특정 아이템을 먹으면 그 아이템에 맞는 음악과, 게임이 끝났을 때 BGM도 꺼진다던지의 역할이 있었고,

SFX같은 경우는 Player나 유저의 이벤트에 따라 발생되었습니다.

 

설정에서 배경음악 조절과 효과음 조절을 하고 싶었기 때문에 만약 Sound Key를 만들 때 이름 형식을 이상하게 했으면 꽤나 힘들었을 것 같습니다.

아래는 현재 제 SoundKey입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
public enum SoundKey
{
    None,
    #region 플레이어
    SFX_PLAYER_JUMP,
    SFX_PLAYER_DOUBLEJUMP,
    SFX_PLAYER_SLIDE,
    SFX_PLAYER_LAND,
    #endregion
 
    #region 아이템 및 충돌
    SFX_ITEM_COIN,
    SFX_ITEM_PICKUP,
    SFX_OBSTACLE_HIT,
    SFX_ITEM_HEAL,
    #endregion
 
    #region UI
    SFX_UI_UICLICK,
    SFX_UI_GAMEOVER,
    #endregion
 
    #region 배경 음악
    BGM_DEFAULT,
    BGM_STAGE1,
    BGM_RESULT,
    BGM_BUFF,
    #endregion
}
cs

 

처음에 Key 이름을 정할때 이렇게 정했기 때문에 배경음을 조절할 때는 BGM에 반응되게, SFX를 조절할 때는 BGM외의 것 이라고 정할 수 있었습니다. 

 

이때 음악이 중복되면서 흐르면 안되기 때문에 AudioManager가 씬마다 하나씩 존재하도록 체크해 주었습니다.

이 때문에 GameManager의 싱글톤이 약간은 흐려질 수 있기 때문에 GameManager가 AudioManager를 생성하는 방식을 쓰고 싶었는데, GameManager는 다른 팀원의 담당이라 최대한 안만지기 위해 일단 제가 하는 곳에서는 따로 관리했습니다.

 

 

  • 생각보다 더 간단했언 EffectManager

EffectManager는 작동 원리는 고민하고 만드는 시간 보다 소스를 찾고 적용하고 위치를 조정하는 시간이 더 길었던 것 같습니다.

 

이 과정에서 저는 

https://itch.io/

 

Download the latest indie games

itch.io is a simple way to find, download and distribute indie games online. Whether you're a developer looking to upload your game or just someone looking for something new to play itch.io has you covered.

itch.io

위의 사이트가 참 좋았습니다.

 

ChatGPT에게 부탁해서 추천순으로 사이트 20개 정도 추천을 받았고, 그렇게 많은 사이트를 조사 및 봤는데, 

찾기 편하고 괜찮더군요.

뭐 사실 큰 차이는 없지만 이 사이트를 주로 이용했다는 느낌입니다.

 

Effect같은 경우에는 다운 받은 애셋을 수직, 수평으로 반전시키면서 방향을 조정하고, Instance에서 offset을 조정하는 등이었으며, 그 외에는 Player의 이벤트가 발생하는 적용되는 코드를 한 줄 적어서 적용시켰습니다.

 


이렇게 어느 정도 모양새를 잡아가고 있습니다.