
å°ããªãããžã§ã¯ãã§ã®äœ¿çšã«é©ãããµãŠã³ããããŒãžã£ã«é¢ããå¥ã®
èšäºãããã®èšäºãæžããã£ããã«ãªããŸããã ãã®æçš¿ã§ã¯ãèè
ããªã¹ãããŠããªãæ¬ ç¹ã®ããã€ãã説æããç§ã®æèŠã§ã¯ãããããä¿®æ£ããç¬èªã®å®è£
ãªãã·ã§ã³ãæäŸããŸãã
ãã®èšäºã¯ãåå¿è
ã®éçºè
ãçµéšãç©ãã§ãã¹ããã©ã¯ãã£ã¹ãç¿åŸããã®ã«åœ¹ç«ã€ã ãã§ãªããç±å¿ãªã¢ãŒããã¯ãã«ãšã£ãŠã圹ç«ã¡ãŸãã ç§ãææ¡ãã解決çã¯å®å
šã«æ®éçã§ã¯ãªããæ¬ ç¹ããããšç¢ºä¿¡ããŠããŸãããç§ã«ãšã£ãŠéèŠã§æ¥œããèŠçŽ ã¯ãèå³ã®ããåhabrayuzerãèªåã«åœ¹ç«ã€äœããåŠã³ãç§ã®ã¢ããã€ã¹ã䜿çšããŠèªåã®ã¢ãžã¥ãŒã«ãæ¹åããããšã§ãã
åé¡
æã£ãŠããå€ç¬
å€ãã®äººãç§ã«å察ãããããããŸããããç¹ã«é³ã®åçŸãªã©ã®åŽé¢ã§ã®ã·ã³ã°ã«ããŒã³ã®äœ¿çšã¯ãããããèŠæš¡ã®ãããžã§ã¯ãã§ã¯åãå
¥ããããªããšèããŠããŸãã ãã®
ã¢ã³ããã¿ãŒã³ã䜿çšãããšãã³ãŒãã®ãã¹ãŠã®ã»ã¯ã·ã§ã³ãç·å¯ã«æ¥ç¶ãããã¿ã€ããçŽæ¥ç€ºãããäžåºŠã«è€æ°ã®æ¹åã«æãçµã³ãŸãã å¯èœã§ããã°ãã·ã³ã°ã«ãã³ã®ãã¹ããæžãããšã¯éåžžã«é£ãããèŠèŠããã決å®è«ã§ãããããŸããã ãŸãããã®ãµãŠã³ããããŒãžã£ãŒã䜿çšããã¢ãžã¥ãŒã«ã®ãã¹ãããšã¬ã¬ã³ãã«äœæããããšã¯ã§ããŸããã å¶åŸ¡ãããŠããªãã©ã€ããµã€ã¯ã«ã§åãã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãããšããäºå®ã«ãããæãèªåèªèº«ã«ãã€ã³ããããäºãã®ããšããŸã£ããç¥ããªãã³ãŒãã®å¥ã
ã®ã»ã¯ã·ã§ã³ã«è«ççã«äŸåé¢ä¿ãäœæããŸãã
äŸïŒ
static void PlayMusic(string name); static void PlaySound(string name, bool pausable = true);
ãã®ã¡ãœããã¯ããµãŒãããŒãã£ã®ã³ãŒããç¹å®ã®ã¡ããã£åãèªèããŠããããšã䞻匵ããŠããŸãã åŒæ°ãæ£ããæž¡ãã®ã¯ããµãŠã³ããæ
åœããåã¢ãžã¥ãŒã«ã®ããã°ã©ããŒã®è²¬ä»»ã§ãã ãŸãããããžã§ã¯ãã«ã¯ãããŸããŸãªUIèŠçŽ ãå°æ/æ»ã«ãããŠãããŠããããç°å¢ãªã©ããã®ãããªå ŽæããããããããŸãã refèšäºãžã®ã³ã¡ã³ãã§ãèªè
ã®1人ã¯ãåŒæ°ã®ãµãŠã³ãã«ç°ãªããã£ãã«ã䜿çšãã
ããšã
ææ¡ããŠããŸããããã«ãããã³ãŒãã®ã»ã¯ã·ã§ã³ãè«ççã«æ¥ç¶ãããŸãã
public void PlayFX (AudioClip clip, SoundFXChannel channel = SoundFXChannel.First, bool forceInterrupt = false) { } public void StopFX (SoundFXChannel channel) { }
çŸåšãããšãã°ãã¡ãœããã䜿çšãããã¿ã³ïŒãŸãã¯ãå¿
èŠã«å¿ããŠUIManagerïŒã¯ãã©ã®ãã£ã³ãã«ã«å±ããŠããããèæ
®ã«å
¥ããå¿
èŠããããŸããå®éãããã¯ããã°ã©ããŒã®è²¬ä»»ã§ãã
ã¢ã¯ã»ã¹ãå€ããã
ç§ãå¥ã®ã³ãŒãã§ã¡ãœãããåŒã³åºããšãMonoBehaviourããåç¶æ¿ãè¿ãããšã¯åžžã«å¥åŠã§ããã ã³ã«ãŒãã³ãèµ·åããŠãå®å
šã§ããïŒ éçºè
ã¯ãããDestroyïŒïŒããä¿è·ããŸãããïŒ ãŸãã¯ãå°æ¥ã³ãŒãã§ãUnityEngineã䜿çšãããããšã確èªãããã§ãããMonoBehaviourã¯å¿
èŠãããŸãããïŒ ãã®åé¡ã¯ãã·ã³ã°ã«ãã³ã«é¢ããåã®æ®µèœã«éšåçã«é©çšãããŸããã€ã³ã¹ã¿ã³ã¹èªäœãžã®ãªã³ã¯ã¯å¿
èŠãããŸãããããã䜿çšããã®ã«ååãªAPIããããŸãã ãããããããã®æ¹æ³ã§éçåŒã³åºããå®è£
ããå Žåã§ãïŒ
private static SoundManager instance; public static ISoundManager Instance { get{ return (instance as ISoundManager) }}
æœè±¡åãåãåããšããç¹å®ã®ã¿ã€ãã䜿çšããå¿
èŠããããŸãïŒ
ISoundManager sm = SoundManager.Instance;
åé¡ãéšåçã«ãã解決ããŸããã
ã¹ããããã¹ãšçŽæ¥ããŠã³ããŒã
private AudioClip LoadClip(string name) { string path = "Sounds/" + name; AudioClip clip = Resources.Load<AudioClip>(path); return clip; }
ç§ã®æèŠã§ã¯ãé³ã®èªã¿èŸŒã¿ã®é
延ã¯å¿
ãããæå³ããªããªãã ãŸãããµãŠã³ãããŠãããã«ã€ã³ããŒãããããã®èšå®ã§ããµãŠã³ããä¿åããæ¹æ³ãæ§æã§ããŸãïŒããã«RAMã«ããã£ã¹ã¯ããã¹ããªãŒãã³ã°ãŸãã¯ã¡ã¢ãªã«ããŒãããåçã®çŽåã«å€æããŸãã
ã€ã³ããŒãèšå®ã®è©³çŽ° ã 第äºã«ããŠãããã¢ã»ã³ããªãã°ãåæããçµéšãããå
šäœçãªãµã€ãºã§ã®å¥å
šãªãªãœãŒã¹ã¯å¹³å3äœä»¥äžã§ããããšã瀺åãããŸãã ãŸããã¡ã¢ãªã®æé©åã¯ãéå§ããå ŽåããµãŠã³ãã§ã¯æ確ã§ã¯ãããŸããã ïŒãã¡ãããããã¯ã²ãŒã ãã¬ã€ããµãŠã³ãã«é¢é£ä»ããããŠãããããžã§ã¯ãã«ã¯é©çšãããªãå¯èœæ§ããããŸãïŒã
ãã°ã®è©³çŽ° ã
ããŠãã³ãŒãã«çž«ãä»ãããããã¹ã«é¢ããŠïŒåã³ãããã°ã©ããŒã®è²¬ä»»ã¯ããããžã§ã¯ããããããžã§ã¯ããžãã®ã¢ãžã¥ãŒã«ã転éãããšãããã¹ã®å¯Ÿå¿ãç£èŠããããšã§ãã æ¬åœã®ãã³ã¹ã¯ããèããŠã¿ããšããã¹ãŠã®ãããžã§ã¯ãã§å¿
èŠã«å¿ããŠãã®ã¢ãžã¥ãŒã«ã®ææ°ããŒãžã§ã³ãååšããããã«ãgitãµãã¢ãžã¥ãŒã«ãäœæããããã«ãªãŒãã£ãªãããŒãžã£ãŒãé
眮ããªãã®ã¯ãªããããšèãããšãã«å§ãŸããŸãã ãã¹ã¯ã³ãŒãã«åã蟌ãŸããŠãããããä»ã®ãããžã§ã¯ãã§ã¯ãšã©ãŒã«ãªããããå€æŽããããšã¯ã§ããŸããã äžæ¹ãããŒã«ã«ã§ã®ã¿ãã¹ãå€æŽããå Žåãgitã¯åžžã«ãã®å€æŽãåæ ããŸãã
èªåã®æ±ºæ
ã¢ãžã¥ãŒã«ã³ãŒãã¯æ¬¡ã®å Žæã«ãããŸãïŒ
https :
//github.com/hexgrimm/Audioèšäºã®ãã¬ãŒã ã¯ãŒã¯å
ã§å
¬éããããã«ãã³ãŒãã¯åçŽåãããŸãã;ã³ãŒããããç解ããããããããã«ããããã®ãã¹ããšæœè±¡åã®ã»ãšãã©ãåé€ããŸããã ç§ã®ãªãŒããŒã·ããã®äžã§ã®ãããžã§ã¯ãã§ã¯ãæ¡åŒµæ§ã®å¯èœæ§ãšããªã¥ãŒã æ§æããããã«å€§ããã¢ãžã¥ãŒã«ã䜿çšãããŸãã
ããã§ã¯ãæåã«ã¢ãŒããã¯ãã£ã«ã€ããŠèª¬æããŸãããã
ãã®ãªãŒãã£ãªã¢ãžã¥ãŒã«ã¯ããã¹ãŠã®ã¢ãŒããã¯ãã£ã®äŸåé¢ä¿ã°ã©ãã®æçµã·ãŒããšèŠãªãããã°ã©ãã®äžã«äŸåé¢ä¿ã¯å¿
èŠãããŸãããäœæè
ã¯é¢ä¿ãããŸããããå¶éããããŸãããã®ã¢ãžã¥ãŒã«ã¯ãã·ã³ã°ã«ãã³ãã©ã€ãã¹ã¿ã€ã«ïŒã·ã³ã°ã«ãã³ãã¶ã€ã³ãã¿ãŒã³ãšæ··åããªãã§ãã ããïŒè©³çŽ°ã«ã€ããŠã¯ãMark Simanèã®ã.NETã§ã®äŸåæ§æ³šå
¥ããåç
§ããŠãã ããïŒã ããã¯ãã¢ããªã±ãŒã·ã§ã³ããšã«1ã€ã®AudioListenerã®ã¿ã®Unity3DèŠä»¶ã«ãããã®ã§ãã ãããžã§ã¯ãã§äŸåæ§æ³šå
¥ã䜿çšããŠããå Žåããã€ã³ããŒã¯æ¬¡ã®ããã«ãªããŸãïŒäŸãšããŠNinjectã䜿çšïŒã
binder.Bind<IAudioController, IAudioPlayer, IMusicPlayer>().To<AudioController>().InSingletonScope();
ãã®ã¯ã©ã¹ãäœæããŠãããžã§ã¯ãã§äœ¿çšããã ãã®å Žåã¯ããªãŒãã£ãªåçåŒã³åºãã®ãã¹ãŠã®ãœãŒã¹ã«åãã€ã³ã¹ã¿ã³ã¹ã®æœè±¡åãæäŸãããŠããããšã確èªããŠãã ããã
äŸãšããŠïŒ
var ac = new AudioController(); IAudioController iac = ac; IAudioPlayer iap = ac; IMusicPlayer imp = ac;
ãããŠãå°æ¥ããã¹ãŠã®ãœãŒã¹ãžã®äœæ¥ãšé
ä¿¡ã¯ãæœè±¡åiacãiapãimpã§ã®ã¿å®è¡ãããŸãã
æœè±¡å
IAudioControllerãäžè¬çãªãµãŠã³ãå¶åŸ¡çšã«èšèšãããã€ã³ã¿ãŒãã§ã€ã¹ïŒãªã³/ãªããå
šäœã®é³éïŒïŒ
IAudioController public interface IAudioController : IDisposable {
IAudioPlayerãã€ã³ã¿ãŒãã§ã€ã¹ã¯2Dããã³3DãµãŠã³ããåçããããã«å¶åŸ¡ããããã«èšèšãããŠããŸãã
IAudioPlayer public interface IAudioPlayer {
IMusicPlayerãé³æ¥œã®åçãšå¶åŸ¡ã
IMusicPlayer public interface IMusicPlayer {
ãµãŠã³ããŸãã¯é³æ¥œãåçããã¡ãœãããåŒã³åºããšãæ¶è²»è
ã«ã¯æ°å€ã³ãŒããäžããããããã䜿çšããŠãµãŠã³ããããã«å¶åŸ¡ã§ããŸãã
ããšãã°ããªããžã§ã¯ããåããŠããå Žåã¯ããªãã«ããããé³æºã®äœçœ®ãå€æŽããŸãã
å¥ã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
SetAudioListenerToPosition(Vector3 position);
3DãµãŠã³ããšåããªã¹ããŒã®å Žåããã®äœçœ®ãå¶åŸ¡ããããã®ã¢ã¯ã»ã¹ãæäŸããå¿
èŠããããŸãã
åçãåŒã³åºãããã®åŒæ°ã®1ã€ãAudioClipã¿ã€ãã§ããããšã«æ°ã¥ãããããããŸããããç§ã®æèŠã§ã¯ãã¯ãªãããšé³æºãä¿åãŸãã¯é¢é£ä»ããããã®ããžãã¯ã¯ã³ã³ãããŒã©èªäœã«ããã¹ãã§ã¯ãªããããã¢ãžã¥ãŒã«ã®æ¶è²»è
ãã¢ãžã¥ãŒã«ãäœæãããã©ããã決å®ã§ããããã«ãªããŸãããµãŠã³ãã¹ãã¬ãŒãžããŒã¹ãŸãã¯ã¯ãªããããœãŒã¹ã«çŽæ¥é¢é£ä»ãããã©ããïŒã»ãšãã©ã®å Žåãããã¯èµ·ãããŸããç°ãªããŠãããã«ã¯å¥³æ§ãšç·æ§ã®å£°ãããããã®æ
å ±ã¯ã€ã³ã«ã®çš®é¡ã«é¢ä¿ãªããŠãããã®äžå¯æ¬ ãªéšåã§ãã sulyatsiyaãé©çšãããŠããªããšããŠãããããšã€ã³ã¿ãã§ãŒã¹IAudioPlayerïŒã䜿çšããŠãã®æ
å ±ãé
ä¿¡ããŸãã
ãŸããIAudioControllerãIDisposableãç¶æ¿ããŠããããšã«æ°ä»ããããããŸããã ããã¯æå³çã«è¡ãããUnity3Dã課ãå¶éã«ãã£ãŠæ£åœåãããŸãã Disposeã¡ãœããã§ã¯ãã¢ãžã¥ãŒã«ã®æäœæ§ã確ä¿ããããã«äœæããããŠããããªããžã§ã¯ããåé€ãããŸããç§ã®æèŠã§ã¯ãã·ãŒã³ãªããžã§ã¯ãã¯ã¢ãžã¥ãŒã«ã«å¯ŸããŠãå¥ã
ã«ç®¡çãããããªãœãŒã¹ã§ãããAudioControllerã¯MonoBehaviourã§ã¯ãªããããDestroyïŒïŒãåŒã³åºãããšã¯ã§ããŸãã ãŸãããŠãããããªãã³ãªã³ã¯ã¯çããŠãããããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãªã³ã¯ãã¯ãªã¢ã§ããŸããã Disposeã¡ãœãããåŒã³åºãããšã«ããããŠãããã«é¢é£ä»ãããããã¹ãŠã®ãªãœãŒã¹ãšãªã³ã¯ãã¯ãªã¢ãããããšãä¿èšŒããŸãã å°ããªãããžã§ã¯ãã§ã¯ããªãŒãã£ãªã¢ãžã¥ãŒã«ã®ã©ã€ããµã€ã¯ã«ã®é·ãã¯åžžã«ã¢ããªã±ãŒã·ã§ã³ã®ãµã€ã¯ã«ãšäŒŒãŠãããããæ°ã«ããå¿
èŠã¯ãªãã§ãããã
ãã©ãŒã ã®å€æ°ã®è¡ã«ã€ããŠãè¬çœªããŸãïŒ
source.pitch = 1 + Random.Range(-0.1f, 0.1f);
ãã¡ãããããžãã¯ãã³ããŒã®äœ¿çšã¯åãå
¥ããããŸãããå®éã®ãããžã§ã¯ãã§ã³ã³ã¹ãã©ã¯ã¿ãŒãééããæ§æã¯ã³ãŒããè€éã«ãããããäŸã®ããã«æå³çã«æžãããŠããŸããåå¿è
ã®ããã«ã§ããã ãã·ã³ãã«ãªã³ãŒãã®ãŸãŸã«ããŠãããããšæããŸãã
ã¯ã©ã¹SavableValue <>ã«ã€ããŠå°ã説æããŸãã Prefsã«ã·ãªã¢ã«åå¯èœãªåãæ ŒçŽãããŠãŒãã£ãªãã£ã¯ã©ã¹ã¯ãå¥ã®ããŒã ã¹ããŒã¹Utilsããã«ããªãããã«ããã®ã¢ãžã¥ãŒã«ã§è€è£œããå¿
èŠããããŸããã BinaryFormatterãã¢ãã€ã«ä»¥å€ã®ãã©ãããã©ãŒã ã§ã©ã®ããã«æ©èœãããããããŸããã
çµæãšããŠäœãèµ·ãã£ãã®ã
ãããžã§ã¯ãã§ã·ã³ã°ã«ãã³ã䜿çšããã«ã䟿å©ãªç¶ãç®ãäœæããŸããå°æ¥ãå¿
èŠã«å¿ããŠæœè±¡åã眮ãæããããšãã§ããŸãã ããã§ãæœè±¡ã¢ãã¯ã䜿çšããŠãããã¯ã©ã¹ã®ãµãŠã³ããåçŸããããã®ãã¹ããäœæã§ããŸãã
IAudioPlayer mock = Substitute.For<IAudioPlayer >(); var testClass = new Class(mock);
ã¯ã©ã¹ãžã®ã¢ã¯ã»ã¹ã¯ã€ã³ã¿ãŒãã§ãŒã¹ã«ãã£ãŠå¶éãããŠããããã以äžã¯äœãã§ããŸããïŒèª€ã£ãaudioCodeã§abusãèæ
®ããªãå ŽåïŒã åå空éHexGrimmDev.Audio以å€ã®äžèŠãªäŸåé¢ä¿ã¯æ¡å€§ããŸããã Mark Simonã®æšå¥šäºé
ã®ããã«ããã¹ãŠã®äžå¿
èŠãªè²¬ä»»ã¯ã¯ã©ã¹ã«ç§»ãããå¿
èŠã«å¿ããŠã³ã³ã¹ãã©ã¯ã¿ãŒãä»ããŠç§»ãããšãã§ããŸãã å€éšã®è«çæ¥ç¶ã¯ãªããã¢ãžã¥ãŒã«ãgit-submoduleãšããŠé
åžã§ããŸãã
ãã¹ãŠã®æç±æãåãããã«åœ¹ç«ã€ããã§ã¯ãªãããšãç解ããŠããŸããããã®å Žåãäœåãªæéã®ç¶ãç®ãäœãã®ã«ããã»ã©æéã¯ããããŸããã§ããã ããã«ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåŸãããã«ããããã¯ã
Unityãããžã§ã¯ããã³ã³ãœãŒã«ã§æ©èœããçç± ãã«ã€ããŠã®Oleg Chumakovã®è¬çŸ©ãèªãããšãææ¡ããŸã
ã ã
ãŸããã³ã³ã¹ãã©ã¯ã¿ãä»ããŠã¢ãžã¥ãŒã«ã«ãããªã³ã¯ãæž¡ãããšã匷ããå§ãããŸããããã¯ãã¡ããæ¶è²»è
ã«ãšã£ãŠããæ確ã§ãããããã«ãèŠåŸãæ°ã«ããŸãã ãããŠæãéèŠãªããšãšããŠãç§ã¯å®å
šãªæ®éåãè¿œæ±ããªãããšãææ¡ããŸãã ãã®ãããã¯ã«é¢ããåªããè¬çŸ©ããã
ãŸã ãã
ã³ã³ããŒãã³ãã®ãŠãããŒãµã«åã®è¿œæ±ã«å€¢äžã«ãªããªãããã« ãã
ã³ãŒãäŸã®æ©èœãªã¹ãïŒ
- é³æ¥œã ãã§ãªãã2Dããã³3DãµãŠã³ããåçããã³å¶åŸ¡ããŸãã
- ãµãŠã³ããã©ã³ã¹ã ïŒãããŒãåŒæ°ã¯ãåã
ã®ãµãŠã³ãã®æ£ç¢ºãªãã©ã³ã¹ããšãããã«0-1ã®ç¯å²ã§æž¡ãããŸãïŒïŒé³éãå€æŽãããšãã«èæ
®ãããŸãïŒ
- ã«ãŒãã®å¯èœæ§ã
- 3DãµãŠã³ãã®ãªã¹ããŒã®äœçœ®ãå€æŽããŸãã
- é³æ¥œãé€ããã¹ãŠã®ãµãŠã³ãã«ã©ã³ãã ãªããã+ -0.1fã®ã·ããããããŸãã ïŒäŸïŒ
- é³æ¥œã®äžæåæ¢ãšåéã
ç¹å®ã®æ©èœïŒ
- AudioMixerã¯äœ¿çšãããŸããã
- ã³ãŒãã«ã¯å€ãã®ããžãã¯ãã³ããŒãããã䜿çšåã«ãªãã¡ã¯ã¿ãªã³ã°ã®å¯Ÿè±¡ãšãªããŸãã
- ãã¥ãŒãžãã¯ãããªéã«ã¹ã ãŒãºãªç§»è¡ã¯ãããŸãããããŸããŸãªæ¹æ³ã§å®è£
ã§ããŸãã
- ã³ãŒãã®åæããã³ãã¹ãã®åé€åŸãäœããæ£ããæ©èœããªãå¯èœæ§ããããŸããã³ãŒãã¯äž»ã«äŸã§ãããæ段ã§ã¯ãããŸããã
- ãã¹ããäœæããã«ã¯ããŠãããã®ã³ã³ããŒãã³ããšAudioControllerã®éã«ç¶ãç®ãå°å
¥ããè¿œå ã®æœè±¡åãéããŠAudioSourceãšAudioListenerãæäœãããã¹ãã§ã¯æœè±¡åããããŒã«çœ®ãæããããšããå§ãããŸãã ããã«ããã¹ãã¯æçæéã§å®è¡ãããŸãã