์„œ๋น„์Šค
๊ต์œก ์ฒ ํ•™

Sound Manager

Abstract

๐Ÿ“Œ
Sound Manager ๋Š” AudioSource ๋ฅผ ์ง์ ‘ ๋“ค๊ณ  ๋‹ค๋‹ˆ์ง€ ์•Š๊ฒŒ ํ•ด ์ฃผ๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. "์ด ์ฃผ์†Œ์˜ ์†Œ๋ฆฌ๋ฅผ, ์ด ๊ทธ๋ฃน์œผ๋กœ, ์—ฌ๊ธฐ์„œ ํ‹€์–ด ์ค˜" ํ•œ ์ค„์ด๋ฉด ํด๋ฆฝ ๋กœ๋“œยท๋นˆ AudioSource ์ฐพ๊ธฐยท์žฌ์ƒยท๋๋‚œ ๋’ค ์ •๋ฆฌ๋ฅผ ๋Œ€์‹  ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๊ฐœ๋…์€ ๋‘˜ โ€” ๊ทธ๋ฃน(๋ณผ๋ฅจ์„ ํ•จ๊ป˜ ์กฐ์ ˆํ•˜๋Š” ๋ฌถ์Œ)๊ณผ ์—์ด์ „ํŠธ(๊ทธ ๊ทธ๋ฃน์ด ๋™์‹œ์— ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์†Œ๋ฆฌ์˜ ์ˆ˜)์ž…๋‹ˆ๋‹ค.
Unity ๊ธฐ๋ณธ ๋ฐฉ์‹๊ณผ ๋น„๊ต
ํ•˜๊ณ  ์‹ถ์€ ์ผ
Unity ๊ธฐ๋ณธ
Sound Manager
ํšจ๊ณผ์Œ ํ•œ ๋ฒˆ
์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค AudioSource โ€ข ํด๋ฆฝ ์ฐธ์กฐ + PlayOneShot
PlaySound("PlayerHurt", "Soundeffects", position)
ํšจ๊ณผ์Œ ๋ณผ๋ฅจ ์ผ๊ด„ ์กฐ์ ˆ
๋ชจ๋“  AudioSource ๋ฅผ ์ฐพ์•„ ๋Œ๊ฑฐ๋‚˜ ๋ฏน์„œ ๊ตฌ์„ฑ
๊ทธ๋ฃน์˜ Volume ํ•˜๋‚˜
๋™์‹œ ์žฌ์ƒ ์ˆ˜ ์ œํ•œ
์ง์ ‘ ๊ตฌํ˜„
๊ทธ๋ฃน์˜ ์—์ด์ „ํŠธ ์ˆ˜ + ์šฐ์„ ์ˆœ์œ„
๋ฐฐ๊ฒฝ์Œ ํŽ˜์ด๋“œ ์ „ํ™˜
์ฝ”๋ฃจํ‹ด์œผ๋กœ ๋ณผ๋ฅจ ๋ณด๊ฐ„
FadeInSeconds, StopSound(id, fadeOutSeconds)
์”ฌ์— ํฉ์–ด์ง„ ํด๋ฆฝ ์ฐธ์กฐ
ํ”„๋ฆฌํŒน๋งˆ๋‹ค ์ธ์ŠคํŽ™ํ„ฐ์— ์—ฐ๊ฒฐ
์ฃผ์†Œ ๋ฌธ์ž์—ด๋งŒ. ํด๋ฆฝ์€ ํ•„์š”ํ•  ๋•Œ ๋กœ๋“œ
ToyboxNightmare ์—์„œ์˜ ์‹ค์ œ ์‚ฌ์šฉ
ํšจ๊ณผ์Œ ์žฌ์ƒ์„ ํ•œ ํ•จ์ˆ˜๋กœ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค.
public static class GameSound { public static void PlaySfx(string assetName, Vector3 worldPosition) { if (string.IsNullOrEmpty(assetName)) return; SoundComponent sound = GameEntry.GetComponent<SoundComponent>(); if (sound == null) return; sound.PlaySound(assetName, SoundTable.SfxGroup, worldPosition); } } // ์“ฐ๋Š” ์ชฝ GameSound.PlaySfx("ZomBunnyDeath", transform.position);
C#
๋ณต์‚ฌ
"์†Œ๋ฆฌ๊ฐ€ ์•ˆ ๋‚˜๋Š” ๊ฒƒ์ด ๊ฒŒ์ž„์„ ๋ฉˆ์ถœ ์ด์œ ๋Š” ๋˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ์›์น™์œผ๋กœ, ์ฃผ์†Œ๊ฐ€ ๋น„์—ˆ๊ฑฐ๋‚˜ ์‚ฌ์šด๋“œ ์‹œ์Šคํ…œ์ด ์—†์œผ๋ฉด ์กฐ์šฉํžˆ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
๊ทธ๋ฃน
์—์ด์ „ํŠธ ์ˆ˜
์šฉ๋„
Music
1
๋ฐฐ๊ฒฝ์Œ (ํ•œ ๋ฒˆ์— ํ•œ ๊ณก)
Soundeffects
8
ํ”ผ๊ฒฉยท์‚ฌ๋ง ํšจ๊ณผ์Œ. ๋™์‹œ์— 8๊ฐœ๊นŒ์ง€ ๊ฒน์นœ๋‹ค
์˜ˆ์ œ๊ฐ€ ๋ชจ๋“  ์†Œ๋ฆฌ๋ฅผ Sound Manager ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฒˆ๊ฐœ ๋ฐœ์‚ฌ์Œ์ด๋‚˜ ์ฐฉํƒ„์Œ์ฒ˜๋Ÿผ ์ดํŽ™ํŠธ ํ”„๋ฆฌํŒน์— ์ด๋ฏธ AudioSource ๋กœ ๋“ค์–ด ์žˆ๋Š” ์†Œ๋ฆฌ๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ํŒŒํ‹ฐํด๊ณผ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ง„ ์—ฐ์ถœ์ด๋ผ ๋–ผ์–ด ๋‚ด๋ฉด ํ”„๋ฆฌํŒน ๋‹จ์œ„๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Sound Manager ๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒƒ์€ ํ”„๋ฆฌํŒน์— ์—†๋Š” ๊ฒŒ์ž„ํ”Œ๋ ˆ์ด ์‚ฌ์šด๋“œ(ํ”ผ๊ฒฉ, ์‚ฌ๋ง)์ž…๋‹ˆ๋‹ค. "์ „๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ"๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฝ๊ณ„๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์‹ค๋ฌด์ž…๋‹ˆ๋‹ค.
์—์ด์ „ํŠธ๊ฐ€ ๋‹ค ์ฐผ์„ ๋•Œ
8๊ฐœ๊ฐ€ ๋ชจ๋‘ ์žฌ์ƒ ์ค‘์ธ๋ฐ 9๋ฒˆ์งธ ์†Œ๋ฆฌ๊ฐ€ ์˜ค๋ฉด:
โ€ข
์ƒˆ ์†Œ๋ฆฌ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์œผ๋ฉด ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์€ ์†Œ๋ฆฌ๋ฅผ ๋Š๊ณ  ๊ทธ ์ž๋ฆฌ์—์„œ ์žฌ์ƒํ•œ๋‹ค
โ€ข
๊ฐ™์œผ๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์†Œ๋ฆฌ๋ฅผ ๋Š๋Š”๋‹ค (๊ทธ๋ฃน์˜ Avoid Being Replaced By Same Priority ๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๋Š์ง€ ์•Š๊ณ  ์ƒˆ ์†Œ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฐ๋‹ค)
โ€ข
๋‚ฎ์œผ๋ฉด ์ƒˆ ์†Œ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  PlaySoundFailure ์ด๋ฒคํŠธ๊ฐ€ ์˜จ๋‹ค
ํƒ„๋ง‰ ๊ฒŒ์ž„์ฒ˜๋Ÿผ ํšจ๊ณผ์Œ์ด ์Ÿ์•„์ง€๋Š” ์žฅ๋ฅด์—์„œ๋Š” "ํ”Œ๋ ˆ์ด์–ด ํ”ผ๊ฒฉ์Œ" ๊ฐ™์€ ์ค‘์š”ํ•œ ์†Œ๋ฆฌ์— ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ค˜์„œ ๋ฌปํžˆ์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
ํ™•์žฅ โ€” ๋ฐฐ๊ฒฝ์Œ ๋„ฃ๊ธฐ
private const float MusicFadeSeconds = 2f; PlaySoundParams musicParams = PlaySoundParams.Create(); musicParams.Loop = true; musicParams.FadeInSeconds = MusicFadeSeconds; mMusicId = sound.PlaySound("BattleTheme", SoundTable.MusicGroup, musicParams); // ๊ณก์„ ๋ฐ”๊ฟ€ ๋•Œ sound.StopSound(mMusicId, MusicFadeSeconds);
C#
๋ณต์‚ฌ
์—”ํ‹ฐํ‹ฐ์— ๋ถ™์–ด ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ์†Œ๋ฆฌ(์—”์ง„์Œ, ๋ฐœ์†Œ๋ฆฌ)๋Š” PlaySound(asset, group, bindingEntity) ๋ฅผ ์”๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์›€์ง์ด๋ฉด ์†Œ๋ฆฌ ์œ„์น˜๋„ ๋”ฐ๋ผ๊ฐ€๊ณ , ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํšŒ์ˆ˜๋˜๋ฉด ์†Œ๋ฆฌ๋„ ํ•จ๊ป˜ ๋ฉŽ์Šต๋‹ˆ๋‹ค.
โš ๏ธ
์ด ์—๋””์…˜์—์„œ ๋‹ค๋ฅธ ์  ยท ๋ณธ๋ฌธ์„ ์ฝ์„ ๋•Œ ์ฃผ์˜ํ•  ์ 
โ€ข
๋ณธ๋ฌธ "์‚ฌ์šฉ ๋ฐฉ๋ฒ• 1~3"์˜ ์ดˆ๊ธฐํ™”ยท๊ทธ๋ฃน ์ƒ์„ฑยท์—์ด์ „ํŠธ ์ถ”๊ฐ€ ์ฝ”๋“œ๋Š” ์ฝ”์–ด API ๋ฅผ ์ง์ ‘ ๋ถ€๋ฅด๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” SoundComponent ๊ฐ€ ์ธ์ŠคํŽ™ํ„ฐ ์„ค์ •(๊ทธ๋ฃน ์ด๋ฆ„, ์—์ด์ „ํŠธ ์ˆ˜)์„ ์ฝ์–ด Start ์—์„œ ์ „๋ถ€ ํ•ด ์ค๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฝ”๋“œ๋Š” PlaySound ๋ถ€ํ„ฐ ์”๋‹ˆ๋‹ค.
โ€ข
์—์…‹ ์ด๋ฆ„ ์ž๋ฆฌ์— ํŒŒ์ผ๋ช…("explosion.wav")์ด ์•„๋‹ˆ๋ผ Addressables ์ฃผ์†Œ("PlayerHurt")๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.
โ€ข
๊ฒฐ๊ณผ๋Š” soundManager.PlaySoundSuccess += ๊ฐ€ ์•„๋‹ˆ๋ผ EventComponent ์˜ PlaySoundSuccessEventArgs / PlaySoundFailureEventArgs ๊ตฌ๋…์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. PlaySoundUpdate / PlaySoundDependencyAsset ์€ ์ด ์—๋””์…˜์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โ€ข
๊ทธ๋ฃน ๋ณผ๋ฅจ๊ณผ AudioMixer ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ๋ณผ๋ฅจ ์Šฌ๋ผ์ด๋”๋Š” ๊ทธ๋ฃน์˜ Volume ์ด ์•„๋‹ˆ๋ผ AudioMixer ์˜ ๋…ธ์ถœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง์ ‘ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค(์›๋ณธ Zombie Toys ์˜ ๊ตฌ์„ฑ์„ ๋”ฐ๋ฆ„). ๋ฏน์„œ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด sound.GetSoundGroup("Soundeffects").Volume = 0.5f ํ•œ ์ค„์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์†Œ๋ฆฌ๋งˆ๋‹ค ํด๋ฆฝ์„ ๊ทธ๋•Œ๊ทธ๋•Œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ์žฌ์ƒํ•  ๋•Œ ํ•œ ๋ฐ•์ž ๋Šฆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋˜ ์žฌ์ƒ์ด ๋๋‚˜๋ฉด ํด๋ฆฝ์„ ๋ฐ˜๋‚ฉํ•˜๋ฏ€๋กœ, ์ž์ฃผ ์“ฐ๋Š” ํšจ๊ณผ์Œ์€ ๋กœ๋”ฉ ํ™”๋ฉด์—์„œ ResourceComponent.LoadAsset ์œผ๋กœ ๋ฏธ๋ฆฌ ํ•œ ๋ฒˆ ๋กœ๋“œํ•ด ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ›์€ ์—์…‹์„ ์ฅ๊ณ  ์žˆ์œผ๋ฉด(ํŒ์ด ๋๋‚  ๋•Œ UnloadAsset) ํด๋ฆฝ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์ดํ›„ ์žฌ์ƒ์— ์ง€์—ฐ์ด ์—†์Šต๋‹ˆ๋‹ค.
โ€ข
Unity 6 ์—์„œ ์†Œ๋ฆฌ๋ฅผ ์žฌ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”์— Attempting to set 'time' on an audio source that has a resource assigned that is not a clip is ignored! ๊ฒฝ๊ณ ๊ฐ€ ์ฐํžˆ๋˜ ๋ฌธ์ œ๊ฐ€ ์›์ž‘์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(์—์ด์ „ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด์„œ ํด๋ฆฝ์ด ์—†๋Š” AudioSource ์˜ time ์„ 0 ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ). ์ด ์—๋””์…˜์—์„œ๋Š” ๊ณ ์ณ ๋‘์–ด ๋” ์ด์ƒ ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Sound Manager ๊ฐœ์š”

Sound Manager๋Š” ๊ฒŒ์ž„์—์„œ ์˜ค๋””์˜ค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌยท๋กœ๋“œยท์žฌ์ƒํ•˜๋Š” ํ•ต์‹ฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
โ€ข
์‚ฌ์šด๋“œ๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์œผ๋กœ ๊ด€๋ฆฌ
โ€ข
์žฌ์ƒ ์ œ์–ด(์žฌ์ƒ, ์ •์ง€, ์ผ์‹œ ์ •์ง€, ์žฌ๊ฐœ)
โ€ข
๊ทธ๋ฃน ๋ฐ ๊ฐœ๋ณ„ ์‚ฌ์šด๋“œ ์ˆ˜์ค€์—์„œ ๋ณผ๋ฅจยท์Œ์†Œ๊ฑฐ ์ œ์–ด
โ€ข
์žฌ์ƒ ์šฐ์„ ์ˆœ์œ„ ์„ค์ • ๋ฐ ์ œํ•œ ์‹œ ๋™์ž‘ ์ •์˜
โ€ข
ํŽ˜์ด๋“œ ์ธยท์•„์›ƒ ์ง€์›
โ€ข
๋น„๋™๊ธฐ ์‚ฌ์šด๋“œ ๋กœ๋”ฉ๊ณผ ์ด๋ฒคํŠธ ์•Œ๋ฆผ

์•„ํ‚คํ…์ฒ˜

โ€ข
Game Framework ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
โ€ข
GameFrameworkModule์„ ์ƒ์†๋ฐ›๊ณ  GameFrameworkEntry์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์‚ฌ์šด๋“œ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ๋Š” Resource Manager์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ํ”Œ๋žซํผ๋ณ„ ๊ตฌํ˜„์€ Helper ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”๋ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

1. Sound Group

์‚ฌ์šด๋“œ๋ฅผ ๊ทธ๋ฃน๋ณ„๋กœ ๋ฌถ์–ด ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Name: ๊ทธ๋ฃน์˜ ๊ณ ์œ  ์ด๋ฆ„
โ€ข
AvoidBeingReplacedBySamePriority: ๋™์ผ ์šฐ์„ ์ˆœ์œ„ ์‚ฌ์šด๋“œ๋กœ ๋Œ€์ฒด ์—ฌ๋ถ€
โ€ข
Mute: ๊ทธ๋ฃน ์ „์ฒด ์Œ์†Œ๊ฑฐ ์—ฌ๋ถ€
โ€ข
Volume: ๊ทธ๋ฃน ์ „์ฒด ๋ณผ๋ฅจ(0.0~1.0)
โ€ข
SoundAgentCount: ํ•ด๋‹น ๊ทธ๋ฃน์˜ ์‚ฌ์šด๋“œ ์—์ด์ „ํŠธ ์ˆ˜

2. Sound Agent

โ€ข
์‹ค์ œ ์‚ฌ์šด๋“œ ์žฌ์ƒ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๊ฐ ๊ทธ๋ฃน์€ ์—ฌ๋Ÿฌ Sound Agent๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋™์‹œ์— ์žฌ์ƒ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šด๋“œ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ํ”Œ๋žซํผ๋ณ„ Agent Helper๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ์ดˆ๊ธฐํ™”

ISoundManager soundManager = GameFrameworkEntry.GetModule<ISoundManager>(); soundManager.SetResourceManager(resourceManager); soundManager.SetSoundHelper(soundHelper);
C#
๋ณต์‚ฌ

2. ์‚ฌ์šด๋“œ ๊ทธ๋ฃน ์ƒ์„ฑ

soundManager.AddSoundGroup("Music", musicGroupHelper); soundManager.AddSoundGroup("SFX", true, false, 0.8f, sfxGroupHelper);
C#
๋ณต์‚ฌ

3. ์‚ฌ์šด๋“œ ์—์ด์ „ํŠธ ์ถ”๊ฐ€

soundManager.AddSoundAgentHelper("Music", musicAgentHelper); for (int i = 0; i < 10; i++) { soundManager.AddSoundAgentHelper("SFX", CreateSoundAgentHelper()); }
C#
๋ณต์‚ฌ

4. ์‚ฌ์šด๋“œ ์žฌ์ƒ

// ๊ธฐ๋ณธ ์žฌ์ƒ int serialId = soundManager.PlaySound("explosion.wav", "SFX"); // ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ PlaySoundParams playSoundParams = PlaySoundParams.Create(); playSoundParams.Priority = 100; playSoundParams.Loop = true; playSoundParams.VolumeInSoundGroup = 0.5f; playSoundParams.FadeInSeconds = 2f; playSoundParams.SpatialBlend = 1f; int musicId = soundManager.PlaySound("background.mp3", "Music", playSoundParams);
C#
๋ณต์‚ฌ

5. ์žฌ์ƒ ์ œ์–ด

soundManager.StopSound(serialId); soundManager.StopSound(serialId, 3.0f); soundManager.PauseSound(serialId); soundManager.ResumeSound(serialId); soundManager.StopAllLoadedSounds();
C#
๋ณต์‚ฌ

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ

โ€ข
PlaySoundSuccess โ€“ ์‚ฌ์šด๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์žฌ์ƒ ์‹œ์ž‘
โ€ข
PlaySoundFailure โ€“ ๋กœ๋“œ ๋˜๋Š” ์žฌ์ƒ ์‹คํŒจ
โ€ข
PlaySoundUpdate โ€“ ๋กœ๋”ฉ ์ง„ํ–‰๋ฅ  ์—…๋ฐ์ดํŠธ
โ€ข
PlaySoundDependencyAsset โ€“ ์‚ฌ์šด๋“œ ์ข…์† ๋ฆฌ์†Œ์Šค ๋กœ๋“œ ์‹œ ํ˜ธ์ถœ
// ์ฝ”์–ด ๋‚ด๋ถ€์—์„œ๋Š” C# ์ด๋ฒคํŠธ๋กœ ๋‚˜๊ฐ€์ง€๋งŒ (์•„๋ž˜), ๊ฒŒ์ž„ ์ฝ”๋“œ์—์„œ๋Š” EventComponent ๋กœ ๋ฐ›๋Š”๋‹ค soundManager.PlaySoundSuccess += (sender, e) => { Debug.Log($"Sound {e.SerialId} ({e.SoundAssetName}) started!"); }; // ๊ฒŒ์ž„ ์ฝ”๋“œ events.Subscribe(PlaySoundSuccessEventArgs.EventId, OnPlaySoundSuccess); events.Subscribe(PlaySoundFailureEventArgs.EventId, OnPlaySoundFailure);
C#
๋ณต์‚ฌ

๋ฆฌ์†Œ์Šค ์‹œ์Šคํ…œ ์—ฐ๋™

โ€ข
Sound Manager๋Š” ์‚ฌ์šด๋“œ ์žฌ์ƒ ์š”์ฒญ ์‹œ Resource Manager๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋กœ๋“œ ์™„๋ฃŒ ํ›„ Sound Agent๋ฅผ ์ƒ์„ฑํ•ด ์žฌ์ƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด ์œ„์น˜

โ€ข
Sound Manager๋Š” Entity Manager, UI Manager์™€ ํ•จ๊ป˜ ํ•ต์‹ฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
โ€ข
์„ธ ๋ชจ๋“ˆ ๋ชจ๋‘ Resource Manager์— ์˜์กดํ•˜๋ฉฐ, ๊ทธ๋ฃน ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์‚ฌ์šฉ ์‚ฌ๋ก€

๋ฐฐ๊ฒฝ์Œ์•…

soundManager.AddSoundGroup("Music", false, false, 0.8f, musicGroupHelper); soundManager.AddSoundAgentHelper("Music", musicAgentHelper); PlaySoundParams musicParams = PlaySoundParams.Create(); musicParams.Loop = true; musicParams.FadeInSeconds = 2.0f; int musicId = soundManager.PlaySound("background.mp3", "Music", musicParams);
C#
๋ณต์‚ฌ

ํšจ๊ณผ์Œ

soundManager.AddSoundGroup("SFX", true, false, 1.0f, sfxGroupHelper); for (int i = 0; i < 5; i++) { soundManager.AddSoundAgentHelper("SFX", CreateSfxAgentHelper()); } soundManager.PlaySound("explosion.wav", "SFX"); soundManager.PlaySound("footstep.wav", "SFX");
C#
๋ณต์‚ฌ

UI ์‚ฌ์šด๋“œ

soundManager.AddSoundGroup("UI", false, false, 0.5f, uiSoundGroupHelper); soundManager.AddSoundAgentHelper("UI", uiSoundAgentHelper); soundManager.PlaySound("button_click.wav", "UI"); soundManager.PlaySound("menu_open.wav", "UI");
C#
๋ณต์‚ฌ

๊ฒฐ๋ก 

Game Framework์˜ Sound Manager๋Š” ๊ทธ๋ฃนยท์—์ด์ „ํŠธ ๊ธฐ๋ฐ˜ ์˜ค๋””์˜ค ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ด, ์„ธ๋ฐ€ํ•œ ์‚ฌ์šด๋“œ ์ œ์–ด์™€ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ํ†ตํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์˜ค๋””์˜ค ํ™˜๊ฒฝ์—์„œ ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์žฌ์ƒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.