유니티로 음악이 관련된 콘텐츠를 만드는 것을 좋아하다보니, AudioSettings.dspTime이란 것을 자주 만나 볼 수 있었다. 그냥 구글링하면 사운드 관련된 정확도를 위해 사용하는 값이라고 대충만 알고 있다가, 정확히 무엇인지 알아봐야겠다는 생각이 들어서 찾아보게 되었다.
DSP 란 Digital Signaling Processing 의 약자인데, 그렇다면 DSP Time 이란 디지털 신호 관련된 처리 시간이라고 유추해볼 수 있었다. 유니티에서 사용되는 dspTime은 오디오 시스템에서 처리된 실제 오디오 샘플 수에 기반하여 반환되는 double 값의 시간이라고 한다. 오디오 관련된 로직을 처리할 땐, 흔히 쓰는 Time.time의 float 값보다 더 정확하다. 그리고 dspTime은 Frame Rate의 영향을 받지 않는다.
AudioSource의 Method 중 PlayScheduled(...) 라고 하는 것이 있는데, 여기에 들어가는 parameter 가 바로 dspTime이 들어가야한다. 만약 5초 뒤에 audioSource를 플레이 하고 싶다고 하면 아래와 같이 작성하면 된다.
private AudioSource audioSource;
void Start()
{
audioSource = GetComponent<AudioSource>();
double curDspTime = AudioSettings.dspTime;
audioSource.PlayScheduled(curDspTime + 5f);
}
그러면 FrameRate의 영향을 받지않고, 오디오 시스템에 기반하여 5초뒤에 음악을 재생할 수 있다.
만약 한 오디오 소스의 오디오 클립이 끝나는 정확한 시간에 다른 오디오소스를 플레이 하고 싶다면 다음과 같이 코드를 작성하면 된다.
[SerializeField] private AudioSource audioSource1;
[SerializeField] private AudioSource audioSource2;
void Start()
{
double curDspTime = AudioSettings.dspTime;
double audioSource1Duration = (double)audioSource1.clip.samples / audioSource1.clip.frequency;
Debug.Log("audiosource 1 duration is : " + audioSource1Duration);
audioSource1.PlayScheduled(curDspTime);
audioSource2.PlayScheduled(curDspTime + audioSource1Duration);
}
'Unity & C#' 카테고리의 다른 글
[C#] C# 과 .NET Framework (0) | 2023.03.25 |
---|---|
[C#] Flags Attribute를 활용하자! (0) | 2022.08.15 |
[유니티] namespace 작성 꿀팁 (0) | 2022.07.26 |
[유니티] sprite atlas로 draw call을 줄여보자 (0) | 2022.07.24 |
[유니티] 스크립트 아이콘 변경 (0) | 2022.07.24 |