입문 강의의 오브젝트 풀링을 사용했었으나 우리 프로젝트의 방향과 맞지 않아서 좀 더 단순한 컴포넌트 느낌의 오브젝트 풀링으로 변경하였다.
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는 AudioMixer
와 Slier(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"이다.
생성한 오디오 믹서 그룹에서 "Add Effect" -> "Lowpass"를 선택하여 붙여준다.
그리고 [Cutoff frequency]의 값을 200~400정도로 조정해주면 저음이 강조된 먹먹한 음향 효과가 적용된다.
게임 플레이 중에 오디오 믹서 그룹의 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);
}
}
맨 아래의 ApplyLowPassFilter
와ResetAudioEffect
만 보면 된다.
AudioMixer.FindSnapshot
메서드로 스냅샷을 찾고
AudioMixerSnapshot.TransitionTo
메서드로 스냅샷을 변경해준다.