내일배움캠프/Unity TeamProject

Unity 2D 팀 프로젝트 - 4

danpat77 2025. 2. 27. 21:58

Untiy 2D 팀 프로젝트 궁수의 전설 래퍼런스 작품 만들기 -  4

 

오늘로 팀 프로젝트 5일차가 진행 되었다. 스킬 구현이 어느 정도 다 끝나 사운드 작업을 추가적으로 하였다.

 


먼저 소리를 내줄 SoundSource를 프리팹으로 만들어 주어 다른 소리와 중복으로 발생할 수 있게 만들어 주자

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();
        Destroy(this.gameObject);
    }
}

 

마지막에 오디오가 끝나면 프리팹이 삭제 될 수 있게 코드를 추가해주자


다음으로 만들어진 SoundSource 프리팹을 관리해줄 SoundManager를 만들어 주자

 

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;

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

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

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

    public static void PlayClip(AudioClip clip)
    {
        SoundSource obj = Instantiate(instance.soundSourcePrefab);
        SoundSource soundSource = obj.GetComponent<SoundSource>();
        soundSource.Play(clip, instance.soundEffectVolume, instance.soundEffectPitchVariance);
    }
}

PlayClip 메서드에서 매개변수로 받은 AudioCilp사운드가 프리팹으로 만든 soundSource를 생성하여 AudioCilp을 재생한다. 이후 재생이 끝나면 이 프리팹은 삭제가 된다.