사운드를 처리하는 주요 컴포넌트
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);
}
// 생략
}
반응형
'스파르타 게임개발종합반(Unity) > TIL - 본캠프 매일 공부 기록' 카테고리의 다른 글
2024.06.17 TIL - switch문, switch식, Func (0) | 2024.06.17 |
---|---|
2024.06.14 TIL - UGUI(Unity's User Interface) (0) | 2024.06.14 |
2024.06.12 TIL - 파티클 시스템(Particle System), 애니메이션 이벤트(Animation Events) (0) | 2024.06.12 |
2024.06.11 TIL - 직렬화 및 파일 입출력, 데이터 관리 특강 정리 (0) | 2024.06.11 |
2024.06.10 TIL - Git 리포지토리에서 특정 폴더 Clone 하기(초보자도 쉽게 따라하기) (0) | 2024.06.11 |
댓글