내일배움캠프/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을 재생한다. 이후 재생이 끝나면 이 프리팹은 삭제가 된다.