TIL 0129 게임개발 입문 팀 과제 - 4 / 오디오 믹서

강성원·2024년 1월 30일
0

TIL 오늘 배운 것

목록 보기
26/69

오늘 개발한 내용

오브젝트 풀링

입문 강의의 오브젝트 풀링을 사용했었으나 우리 프로젝트의 방향과 맞지 않아서 좀 더 단순한 컴포넌트 느낌의 오브젝트 풀링으로 변경하였다.

public class ObjectPool : MonoBehaviour
{

    [SerializeField]
    private GameObject _prefab;
    [SerializeField]
    private int _size;

    protected Queue<GameObject> _pool;

    private void Awake()
    {
        _pool = new Queue<GameObject>();

        for (int i = 0; i < _size; ++i)
        {
            GameObject obj = Instantiate(_prefab, transform);
            obj.SetActive(false);
            _pool.Enqueue(obj);
        }
    }

    public GameObject SpawnFromPool()
    {
        GameObject obj = _pool.Dequeue();
        _pool.Enqueue(obj);

        return obj;
    }
}

원래라면 오브젝트 풀에 여러개의 큐(풀)과 여러 종류의 프리팹을 받아서 오브젝트를 관리해줬다면

여기서는 하나의 프리팹을 받고 하나의 큐(풀)에 원하는 만큼 오브젝트를 준비하는 방식이다.

오브젝트 풀이 필요하면 갖다 쓰는 느낌으로.

음량 조절 기능/UI 구현

음량 조절 기능과 UI는 AudioMixerSlier(UI)를 이용하여 구현했다.

오디오 믹서 생성

그룹 3개를 만들어주고 그룹의 볼륨을 우클릭하여 "Expose Volume to script"을 선택해준다.

코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class AudioMixerController : MonoBehaviour
{

    private AudioMixer _audioMixer;

    [SerializeField] private Slider _masterVolumeSlider;
    [SerializeField] private Slider _bgmVolumeSlider;
    [SerializeField] private Slider _sfxVolumeSlider;


    private void Awake()
    {
        _audioMixer = Resources.Load<AudioMixer>("Audio/AudioMixer/AudioMixer");
        _masterVolumeSlider.onValueChanged.AddListener(SetMasterVolume);
        _bgmVolumeSlider.onValueChanged.AddListener(SetBGMVolume);
        _sfxVolumeSlider.onValueChanged.AddListener(SetSFXVolume);
    }

    private void SetMasterVolume(float value)
    {
        _audioMixer.SetFloat("Master", Mathf.Log10(value)*20);
    }

    private void SetBGMVolume(float value)
    {
        _audioMixer.SetFloat("BGM", Mathf.Log10(value) * 20);
    }

    private void SetSFXVolume(float value)
    {
        _audioMixer.SetFloat("SFX", Mathf.Log10(value) * 20);
    }
}

위와 같이 코드를 만들어주고 슬라이더 UI를 인스펙터에서 추가해주자.

Lowpass Frequency 적용(먹먹한 소리)

게임이 오버됐을 때 먹먹한 소리를 내주고 싶어서 여러 방법을 찾아보았다.

구글링을 하면 전부 전문용어 뿐이라서 오디오 믹서 그룹의 이펙트를 아무거나 건드려보다가 원하는 효과를 찾았고, 그것이 바로 "Lowpass Frequency"이다.

  • 생성한 오디오 믹서 그룹에서 "Add Effect" -> "Lowpass"를 선택하여 붙여준다.

  • 그리고 [Cutoff frequency]의 값을 200~400정도로 조정해주면 저음이 강조된 먹먹한 음향 효과가 적용된다.

Lowpass Frequency 값 변경 => 스냅샷 변경

게임 플레이 중에 오디오 믹서 그룹의 Lowpass Frequency의 값을 변경하는 기능을 구현하려고 했다.

하지만 오디오 믹서 그룹의 파라미터에 접근하는 방법을 찾지 못해서 외국 형님들이 추천한 스냅샷을 사용했다.
(동일한 오디오 믹서의 이펙트를 저장하는 프리셋 같은 느낌)

스냅샷 만들기

  • 아래와 같이 기본 스냅샷이 있고 "+" 버튼을 눌러서 스냅샷을 추가할 수 있다.

  • 새로 만든 스냅샷을 선택하고 오디오 믹서 그룹 [BGM]을 선택한 후에 Lowpass의 값을 조절해주면
    [Default]스냅샷의 [BGM]의 Lowpass 값은 5000이고,
    [BGM_LowpassFilter]스냅샷의 [BGM]의 Lowpass 값은 350인 것을 볼 수 있다.

코드에서 스냅샷 변경하기

public class AudioManager : MonoBehaviour
{
    // ===== BGM ===== 생략

    // ===== SFX ===== 생략

    // ===== Audio Mixer =====
    [SerializeField] private AudioMixer _audioMixer;
    private AudioMixerGroup _bgmMixerGroup;
    private AudioMixerGroup _sfxMixerGroup;


    private void Start()
    {
        Init();
        BGMPlay(BGM.Lobby);
        GameManager.I.EndGame += ApplyLowPassFilter;
        GameManager.I.OnGame += ResetAudioEffect;
    }

    private void Init()
    {
        // 오디오 믹서 초기화
        _audioMixer = Resources.Load<AudioMixer>("Audio/AudioMixer/AudioMixer");
        _bgmMixerGroup = _audioMixer.FindMatchingGroups("Master/BGM")[0];
        _sfxMixerGroup = _audioMixer.FindMatchingGroups("Master/SFX")[0];
        
        ,,, 생략 ,,,
    }



    public void ApplyLowPassFilter()
    {
        if (_audioMixer != null)
            _audioMixer.FindSnapshot("BGM_LowpassFilter").TransitionTo(0);
    }

    public void ResetAudioEffect()
    {
        if (_audioMixer != null)
            _audioMixer.FindSnapshot("Default").TransitionTo(0f);
    }


}

맨 아래의 ApplyLowPassFilterResetAudioEffect만 보면 된다.

AudioMixer.FindSnapshot메서드로 스냅샷을 찾고
AudioMixerSnapshot.TransitionTo메서드로 스냅샷을 변경해준다.

profile
개발은삼순이발

0개의 댓글