유니티 엔진 (Unity Engine)

[Unity] 간단한 SoundManager 소스코드 공유

원생계 2021. 3. 1. 17:30

.

 

게임을 만들 때 사운드 처리도 필수도 들어가게 되죠.

최근 간단하게 사운드 재생 처리할 일이 있어서 모듈을 만들었습니다. 쉽고 간단한 코드라서 메모 차원에서 공유해봅니다.

GitHub 의 Rrepository 에 올리고 링크를 공유하는 것도 좋겠지만, 대부분의 코드는 개인 저장소로 관리하고 있어서, 이번처럼 간단한 코드 메모+공유 차원에서 다루게 된다면 스닙펫처럼 일부만 발췌해서 블로그로 공유하는 방식으로 해볼까 합니다.

우선 제목에서 다뤘듯이 아래는 SoundManager 의 풀 소스코드.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WSRSoundManager
{
    Dictionary<int, AudioClip> oAudioClipsMap = new Dictionary<int, AudioClip>();
    AudioSource oAS_Once = null;
    AudioSource oAS_Loop = null;

    private static WSRSoundManager _instance = null;
    public static WSRSoundManager Instance
    {
        get
        {
            if (_instance == null) _instance = new WSRSoundManager();
            return _instance;
        }
    }
    
    public void CreateDefaultAudioSource()
    {
        if (null != oAS_Once && null != oAS_Loop)
        {
            Debug.Log("Already Created Dafault AudioSources!");
            return;
        }

        GameObject oGameManager = GameObject.Find("SoundManager");
        {
            oGameManager = new GameObject("SoundManager");
            Debug.Assert(oGameManager != null, "Can not create new SoundManager GameeObject");
        }
        GameObject.DontDestroyOnLoad(oGameManager);

        oAS_Once = oGameManager.AddComponent<AudioSource>();
        oAS_Once.loop = false;

        oAS_Loop = oGameManager.AddComponent<AudioSource>();
        oAS_Loop.loop = true;
    }

    public void Regist(int iInAudioKey, AudioClip oInAudioClip)
    {
        Debug.Assert(oInAudioClip != null, "Invalid AudioClip! AudioKey= " + iInAudioKey.ToString());

        if (oAudioClipsMap.ContainsKey(iInAudioKey) == true)
        {
            Debug.Log("Already Registed AudioClip! AudioKey= " + iInAudioKey.ToString());
            return;
        }
        oAudioClipsMap.Add(iInAudioKey, oInAudioClip);
    }

    public void PlayAudioClip(int iInAudioKey, bool bIsLoop)
    {
        if (oAudioClipsMap.ContainsKey(iInAudioKey) == false)
        {
            Debug.Log("Not exist AudioClip! AudioKey= " + iInAudioKey.ToString());
            return;
        }

        if (bIsLoop)
        {
            Debug.Assert(oAS_Loop != null, "AudioSource is null!");
            oAS_Loop.Stop();
            oAS_Loop.clip = oAudioClipsMap[iInAudioKey];
            oAS_Loop.Play();
        }
        else
        {
            Debug.Assert(oAS_Once != null, "AudioSource is null!");
            oAS_Once.PlayOneShot(oAudioClipsMap[iInAudioKey]);
        }
    }
}

메소드도 3개 뿐인 클래스라 사용법도 간단합니다.
싱글턴으로 제작했기 때문에 별도로 객체를 생성할 필요는 없습니다만, 초기화는 필요합니다.

// 기본 오디오 소스 생성. 이 때 Hierarchy에 SoundManager 오브젝트가 생성 됨.
WSRSoundManager.Instance.CreateDefaultAudioSource();

// 재생하려는 사운드클립 등록
WSRSoundManager.Instance.Regist(100, BGM_Title);
WSRSoundManager.Instance.Regist(101, BGM_Play);
WSRSoundManager.Instance.Regist(1000, SE_Attack);
WSRSoundManager.Instance.Regist(1001, SE_Damage);

// 사운드 재생이 필요한 곳에서 재생
WSRSoundManager.Instance.PlayAudioClip(100, true);
WSRSoundManager.Instance.PlayAudioClip(1000, false);
WSRSoundManager.Instance.PlayAudioClip(1001, false);

간단한 코드 간단하게 공유 끝.

​.게임,게임개발,게임프로그래밍,Unity,UnityEngine,사운드,사운드처리

728x90
반응형