SoundManger
- BGM을 담당하는 AudioSource 1개, Player SFX를 담당하는 AudioSource 1개, 그 외 SFX를 담당하는 AudioSource 여러개를 가지고 있음
- BGM과 SFX의 사운드가 모두 SoundManger에서 재생
- MainCamera 자식 오브젝트에 있는 빈 오브젝트에 각각 AudioSource를 추가하고 연결하여 사용
- 3D 사운드의 경우, 오류가 많기 때문에 아래와 같이 계산식으로 사용
- 그 외 SFX를 담당하는 AudioSource의 수는 게임의 규모에 따라 다름, 일반적으로 중복될 수 있는 사운드의 수로 설정 (보통 3~5개가 적당)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManager : MonoBehaviour
{
[Header("PlayerAudioSource")]
[SerializeField] private AudioSource _playerBGMAudioSource;
[SerializeField] private AudioSource _playerSFXAuidoSource;
[Header("ETCAudioSource")]
[SerializeField] private AudioSource[] _etcSFXAudioSources;
private Dictionary<string, AudioClip> _bgm;
private Dictionary<string, AudioClip> _sfx;
private int _index;
[SerializeField] private float _maxDistance = 50f;
[Range(0f, 1f)] public float StartVolume = 0.1f;
public void Init()
{
// 초기 셋팅
_bgm = new Dictionary<string, AudioClip>();
_sfx = new Dictionary<string, AudioClip>();
_playerBGMAudioSource.loop = true;
_playerBGMAudioSource.volume = StartVolume;
_playerSFXAuidoSource.playOnAwake = false;
_playerSFXAuidoSource.volume = StartVolume;
for (int i = 0; i < _etcSFXAudioSources.Length; i++)
{
_etcSFXAudioSources[i].playOnAwake = false;
_etcSFXAudioSources[i].volume = StartVolume;
}
// BGM
// SFX
_sfx.Add("PlayerGun", Resources.Load<AudioClip>("Sound/SFX/SFX_Assault Single Shot"));
}
// 메모리 해제
public void Release()
{
}
// 다른 오브젝트에서 출력되는 사운드
// 2D에서는 Vector2.Distance 사용
public void StartSFX(string name, Vector3 position)
{
_index = _index % _etcSFXAudioSources.Length;
float distance = Vector3.Distance(position, GameManager.I.PlayerManager.Player.transform.position);
float volume = 1f - (distance / _maxDistance);
_etcSFXAudioSources[_index].volume = Mathf.Clamp01(volume) * StartVolume;
_etcSFXAudioSources[_index].PlayOneShot(_sfx[name]);
_index++;
}
// Player에서 출력되는 사운드
public void StartSFX(string name)
{
_playerSFXAuidoSource.PlayOneShot(_sfx[name]);
}
public void StartBGM(string name)
{
_playerBGMAudioSource.Stop();
_playerBGMAudioSource.clip = _bgm[name];
_playerBGMAudioSource.Play();
}
public void StopBGM()
{
if(_playerBGMAudioSource != null) _playerBGMAudioSource.Stop();
}
}
그리고 각각의 Audio Source 컴포넌트를 추가할 빈 오브젝트를 Main Camera 자식으로 만들어주고 사운드매니저와 연결해줌.
'유니티' 카테고리의 다른 글
DontDestroyOnLoad (0) | 2023.12.28 |
---|---|
씬 이동 (0) | 2023.12.28 |
쿨타임 표시 구현 (0) | 2023.12.28 |
이미지 파일 Sprite 변환 (0) | 2023.12.28 |
Terrain (0) | 2023.12.27 |