카테고리 없음

유니티 오디오 매니저로 오디오 관리하기 + enum으로 편하기 사용하기

게발인개발자 2024. 2. 20. 21:00

오디오를 BGM만 넣으면 관리가 쉽지만 효과음(SFX)이 많아지면 관리가 힘들어진다.

그래서 오디오 매니저를 싱글톤화하여 관리를 하기로 했다.

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;    
// 배경음에 필요한 변수들
    [Header("#BGM")]
    public  AudioClip BGMclip;
    public float bgmVolume;
    AudioSource bgmSource;
// 효과음을 관리하기 위한 변수들 + 배열에서 빼서 사용할 수 있도록
    [Header("#SFX")]
    public AudioClip[] sfxClips;
    public float sfxVolume;
    public int channels;
    private int channelIndex;
    AudioSource[] sfxPlayers;

//배열에서 인덱스로 빼면 헷갈릴 것을 염두하여 enum으로 해당 오디오를 가져올 수 있다.
    public enum Sfx
    {
        PlayerAttack, PlayerDamage, PlayerEquip,
        PlayerEat, PlayerHarvest, PlayerPulling,
        MonsterDamage, ItemCrafting, MakeFood, PlayerMining
    }


    private void Awake()
    {
        instance = this;

        Init();
        PlayBgm();
    }
// 모든 오디오 클립을 초기화하여 사용하기 위한 함수
    private void Init()
    {
        //배경음 플레이어 초기화
        GameObject bgmObject = new GameObject("BGMPlayer");
        bgmObject.transform.parent = transform;
        bgmSource = bgmObject.AddComponent<AudioSource>();
        bgmSource.playOnAwake = true;
        bgmSource.loop = true;
        bgmSource.volume = bgmVolume;
        bgmSource.clip = BGMclip;

        //효과음 플레이어 초기화
        GameObject sfxObject = new GameObject("sfxPlayer");
        sfxObject.transform.parent = transform;
        sfxPlayers = new AudioSource[channels];
       
        
        for(int i = 0; i < sfxPlayers.Length; i++)
        {
            sfxPlayers[i] = sfxObject.AddComponent<AudioSource>();
            sfxPlayers[i].playOnAwake = false;
            sfxPlayers[i].loop = false;
            sfxPlayers[i].volume = sfxVolume;
        }
    }
    // 배경음 플레이 함수
    public void PlayBgm()
    {
        bgmSource.Play();
    }
// 상황에 맞는 효과음을 사용하기 위한 함수
    public void PlaySffx(Sfx sfx)
    {
        for(int index = 0; index < sfxPlayers.Length;index++)
        {
            int loopindex = (index + channelIndex) % sfxPlayers.Length;
            if (sfxPlayers[loopindex].isPlaying)
                continue;

            channelIndex = loopindex;
            sfxPlayers[loopindex].clip = sfxClips[(int)sfx];
            sfxPlayers[loopindex].Play();
            break;
        }        
    }