유니티

SoundManger

잼잼재미 2023. 12. 28. 21:25

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