Ch 12. 오디오 매니저(풀링 개념)

Date:     Updated:

카테고리:

태그:

케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

🚀 Audio Manager

image

  • BGMPlayer 👉 Audio Source 1개
  • SFXPlayer 👉 Audio Source 8개

BGM 은 게임 당 하나의 BGM 만 재생되는 반면, 효과음은 동시에 여러개가 재생될 수 있으며 1 회성으로 재생이 된다. 그래서 오브젝트들 마다 효과음을 위한 AudioSource 들을 붙여주기보다는 하나의 Audio Manager 오브젝트를 static 싱글톤으로 사용하고 거기에 Audio Source를 미리 여러개 붙여놓고 효과음 재생할 때마다 SFXPlayer 싱글톤 오브젝트의 재생 중이지 않은 Audio Source에서 재생을 시키는 것이다. 아직 재생 중이지 않은 Audio Source 를 빌려서 이를 통해 효과음 재생. Audio SOurce들을 오브젝트 풀링처럼 활용하는 느낌이다.

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

[System.Serializable]
public class Sound
{
    public string name;
    public AudioClip clip;
}

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;

    [SerializeField] Sound[] sfx = null;
    [SerializeField] Sound[] bgm = null;

    [SerializeField] AudioSource bgmPlayer = null;
    [SerializeField] AudioSource[] sfxPlayer = null;

    private void Start()
    {
        instance = this;
    }

    public void PlayBGM(string p_bgmName)
    {
        for (int i = 0; i < bgm.Length; i++)
        {
            if (p_bgmName == bgm[i].name)
            {
                bgmPlayer.clip = bgm[i].clip;
                bgmPlayer.Play();
            }
        }
    }

    public void StopBGM()
    {
        bgmPlayer.Stop();
    }

    public void PlaySFX(string p_sfxName)
    {
        for (int i = 0; i < sfx.Length; i++)
        {
            if (p_sfxName == sfx[i].name)
            {
                for (int j = 0; j < sfxPlayer.Length; j++)
                {
                    // SFXPlayer에서 재생 중이지 않은 Audio Source를 발견했다면 
                    if (!sfxPlayer[j].isPlaying)
                    {
                        sfxPlayer[j].clip = sfx[i].clip;
                        sfxPlayer[j].Play();
                        return;
                    }
                }
                Debug.Log("모든 오디오 플레이어가 재생중입니다.");
                return;
            }
        }
        Debug.Log(p_sfxName + " 이름의 효과음이 없습니다.");
        return;
    }
}

image

✈ 재생

AudioManager.instance.PlayBGM("BGM0");

싱글톤 호출!

AudioManager theAudio;
theAudio = AudioManager.instance;
theAudio.PlaySFX("Clap");

호출이 잦을 예정이라면 미리 캐싱해두기



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 4 카테고리 내 다른 글 보러가기

댓글 남기기