스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.06.13 TIL - SoundMnager(사운드 컨트롤)

테크러너 2024. 6. 13.

사운드를 처리하는 주요 컴포넌트

AudioClip

  • `AudioClip`은 사운드 파일을 Unity에서 사용할 수 있도록 하는 데이터 타입이다.
  • `.wav`, `.mp3`, `.ogg` 등 다양한 형식의 오디오 파일을 지원한다.

AudioSource

  • `AudioSource` 컴포넌트는 사운드를 재생하는 데 사용된다.
  • `AudioSource`에 `AudioClip`을 연결하여 재생할 수 있다.
  • `AudioSource`는 3D 사운드 설정, 볼륨 조절, 사운드 반복 재생 등의 설정을 제공한다.

AudioListener

  • `AudioListener` 컴포넌트는 사운드를 듣는 포인트를 나타낸다.
  • 일반적으로 주요 카메라에 `AudioListener`가 위치한다.
  • 게임에는 하나의 `AudioListener`만 있어야 한다.

 

SoundManager.cs

using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;

    [SerializeField][Range(0f, 1f)] private float soundEffectVolume;
    [SerializeField][Range(0f, 1f)] private float soundEffectPitchVariance;
    [SerializeField][Range(0f, 1f)] private float musicVolume;

    private AudioSource musicAudioSource;
    public AudioClip musicClip;

    private void Awake()
    {
        instance = this;
        musicAudioSource = GetComponent<AudioSource>();
        musicAudioSource.volume = musicVolume;
        musicAudioSource.loop = true;
    }

    private void Start()
    {
        ChangeBackGroundMusic(musicClip);
    }

    public static void ChangeBackGroundMusic(AudioClip music)
    {
        instance.musicAudioSource.Stop();
        instance.musicAudioSource.clip = music;
        instance.musicAudioSource.Play();
    }

    public static void PlayClip(AudioClip clip)
    {
        GameObject obj = GameManager.Instance.ObjectPool.SpawnFromPool("SoundSource");
        obj.SetActive(true);
        SoundSource soundSource = obj.GetComponent<SoundSource>();
        soundSource.Play(clip, instance.soundEffectVolume, instance.soundEffectPitchVariance);
    }
}

 

 

SoundSource.cs

using UnityEngine;

public class SoundSource : MonoBehaviour
{
    private AudioSource audioSource;

    public void Play(AudioClip clip, float soundEffectVolume, float soundEffectPitchVariance)
    {
        if (audioSource == null)
            audioSource = GetComponent<AudioSource>();

        CancelInvoke();
        audioSource.clip = clip;
        audioSource.volume = soundEffectVolume;
        audioSource.Play();
        audioSource.pitch = 1f + Random.Range(-soundEffectPitchVariance, soundEffectPitchVariance);

        Invoke("Disable", clip.length + 2);
    }

    public void Disable()
    {
        audioSource.Stop();
        gameObject.SetActive(false);
    }
}

 

 

사용 예시

[SerializeField] private AudioClip ShootingClip;

private void CreateProjectile(RangedAttackSO RangedAttackSO, float angle)
{
    // 위의 코드 생략
    if (ShootingClip) SoundManager.PlayClip(ShootingClip);
}

 

[SerializeField] private AudioClip damageClip;

public bool ChangeHealth(float change)
{
    // 생략
    if (change > 0)
    {
        OnHeal?.Invoke();
    }
    else
    {
        OnDamage?.Invoke();

        if (DamageClip) SoundManager.PlayClip(DamageClip);
    }
    // 생략
}
반응형

댓글